6

在 FreeBSD 系统上,在下面的顶部输出中,mysql 守护进程处于“sbwait”状态。这意味着什么?

last pid: 12833;  load averages:  0.18,  0.26,  0.25    up 3+17:40:21  04:58:46
26 processes:  1 running, 25 sleeping
CPU: 16.5% user,  0.0% nice, 12.8% system,  6.8% interrupt, 63.9% idle
Mem: 184M Active, 137M Inact, 88M Wired, 6308K Cache, 53M Buf, 7192K Free
Swap: 4096M Total, 420K Used, 4095M Free

  PID USERNAME  THR PRI NICE   SIZE    RES STATE    TIME   WCPU COMMAND
 1772 mysql      17  30    0   224M   165M sbwait 511:31 14.79% mysqld
12833 root        1  20    0  9944K  1488K RUN      0:00  0.10% top
 1472 root        1  20    0  9612K   828K select   5:07  0.00% powerd
 1465 root        1  20    0 11296K  1644K select   2:01  0.00% ntpd
 1804 root        1  20    0 11324K  2140K select   0:37  0.00% sendmail
 1403 root        1  20    0 12200K  2320K select   0:27  0.00% nmbd
 1814 root        1  20    0  9644K  1004K nanslp   0:08  0.00% cron
 1407 root        1  20    0 20756K  3756K select   0:06  0.00% smbd
 1273 root        1  20    0  9612K  1036K select   0:04  0.00% syslogd
11937 root        1  20    0 15788K  3124K select   0:03  0.00% sshd
 1808 smmsp       1  20    0 11324K  1864K pause    0:01  0.00% sendmail
 1438 root        1  20    0 20840K  3696K select   0:00  0.00% smbd
 1111 _dhcp       1  20    0  9540K  1136K select   0:00  0.00% dhclient
11941 root        1  20    0 10940K  2024K pause    0:00  0.00% csh
 1517 mysql       1  52    0  9924K  1072K wait     0:00  0.00% sh
 1073 root        1  47    0  9540K  1012K select   0:00  0.00% dhclient
 1797 root        1  20    0 13064K  1892K select   0:00  0.00% sshd
4

2 回答 2

7

这意味着进程中的进程中的一个线程正在等待数据到达套接字。top 的默认模式对于像 mysqld 这样的线程进程来说信息量不是很大;虽然您有 17 个 mysql 线程,但 top 在此模式下只能显示其中一个。您应该使用'-H' 标志到顶部(或在顶部时使用'H' 键盘命令)来分别查看各个线程,这将显示每个线程的不同状态。

于 2012-10-02T19:34:44.917 回答
3

使用来源:

find /usr/src -type f  -exec grep -H sbwait {} \+

这会给你一些文件来查看。

/usr/src/sys/kern/uipc_sockbuf.c

/*
 * Wait for data to arrive at/drain from a socket buffer.
 */
int
sbwait(struct sockbuf *sb)
{

        SOCKBUF_LOCK_ASSERT(sb);

        sb->sb_flags |= SB_WAIT;
        return (msleep(&sb->sb_cc, &sb->sb_mtx,
            (sb->sb_flags & SB_NOINTR) ? PSOCK : PSOCK | PCATCH, "sbwait",
            sb->sb_timeo));
}
于 2012-08-15T10:58:28.250 回答