3. 搞玄学?看看进程切换

看看进程切换

$ vmstat 2
procs  ------------memory------------  --swap-- -----io---- ---system---- ---cpu--
 r  b  swpd     free    buff    cache   si   so    bi    bo    in      cs us sy id 
39  0     0 10823876 2415652 46400008    0    0 28828  3775 190521 308902 16 27 54  
 8  6     0 10856772 2415652 46400248    0    0 23784  2222 186975 310175 12 18 69  
 5  0     0 10876804 2415656 46400552    0    0 28852  3420 182219 295182 12 25 59  
29  0     0 10845268 2415656 46401136    0    0 24908  3680 189906 308567 14 24 59  
26  1     0 10891356 2415656 46401156    0    0 20640  4059 187160 309603 14 23 62
 3  0     0 10946284 2415656 46401596    0    0 17920  3622 185902 309350 13 21 65
15  1     0 10894820 2415656 46402168    0    0 19968  4660 180810 302132 14 29 57
 6  1     0 10922464 2415656 46402156    0    0  7680  1375 171290 297429  8 11 81

vmstat 能汇报操作系统当前的状态, 看上面的第二行, 不同的参数划分成不同类下的指标

  • 进程相关(procs指标)

    • r = ready. 就绪进程的数量

    • b = blocked. 不可中断的进程数量

  • 内存相关(memory指标)

    • swpd = swapped. 虚拟内存使用量

    • free 还有多少内存可用

  • 进程中断数量(system指标)

    • in = interrupted. 中断数量(包含进程/线程的中断), 包括因为等待IO, 以及时间片到期等因素

    • cs = context switch. 上下文切换数量

$ pidstat -w 2
[xiaohan@cm-be-test-5bd6e93d ~]$ pidstat -w 2
Linux  (cm-be-test-5bd6e93d)         2020年11月18日  _x86_64_        (28 CPU)

10时58分21秒       PID   cswch/s nvcswch/s  Command
10时58分23秒       115     10.00      0.00  nginx
10时58分23秒       116     10.00      0.00  nginx
10时58分23秒       118     10.00      0.00  nginx
10时58分23秒       119     10.00      0.00  nginx
10时58分23秒       120     10.00      0.00  nginx
10时58分23秒       121     10.00      0.00  nginx
10时58分23秒       122      9.50      0.00  nginx
10时58分23秒     22965      0.50      0.00  pidstat

pidstat 能汇报上下文切换的情况:

  • cswtch: context switch, 每秒上下文切换次数

  • nv-cswtch: non-voluntary-context-switch, 每秒非自愿上下文切换次数(指时间片到期)

与进程相关的API

  • exec: 执行一个新任务, 只不过使用另一个App的镜像

  • fork: 出一个子进程, 此时父进程如果

    • 不等子进程就直接退出, 子进程全都变成孤儿进程变成1号进程的子进程. 这招我们在pause容器的设计的时候说过, 我们需要pause作为1号进程来负责收集并妥善给所有孤儿进程善后

    • 不使用wait来收集子进程的信息, 故而子进程的进程描述符依旧留在操作系统中, 占用PID信息

Last updated

Was this helpful?