我正在调查一个运行着许多oracle数据库实例的linux服务器上的极端负载 (但CPU,IOWAIT,SYS,磁盘/networking活动较低)的奇怪情况 。
当在机器上加载一些cpu时,一切看起来都很正常,正如我们在vmstat中看到的那样:
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- 2 0 193312 1959440 403368 38270032 0 0 2504 25 4660 3916 16 5 78 1 0 1 0 193312 1899352 403560 38277932 0 0 2198 1720 5175 4675 14 5 79 2 0 1 3 193312 1878992 403584 38279024 0 0 13900 14261 2054 2704 6 1 93 1 0
一旦机器空转 ,就会显示一个奇怪的行为:
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- 102 0 173164 1909664 408596 38271676 0 0 1124 1094 2312 2345 4 3 91 3 0 15 5 173164 1909968 408620 38271904 0 0 256 677 472 843 2 0 98 0 0 94 0 173164 1858988 408664 38311548 0 0 292 161 1786 1600 5 2 92 1 0 51 0 173164 1859832 408664 38311856 0 0 849 957 1044 1436 2 1 95 2 0 200 12 173164 1859708 408680 38311840 0 0 96 536 559 636 1 0 99 0 0 60 0 173164 1844480 408704 38328308 0 0 288 653 632 830 1 1 98 0 0 124 0 173164 1845340 408712 38329748 0 0 144 947 1746 1926 3 2 95 1 0 48 1 173164 1850432 408752 38329792 0 0 268 844 1783 1862 2 3 94 1 0 509 0 173164 1882880 408752 38329832 0 0 60 12 1893 1726 2 2 95 1 0 125 0 173164 1884208 408768 38329868 0 0 160 816 1918 2426 4 1 95 0 0
正如你可以看到在第一列,我们有一个高运行队列长度 ,什么sar -q 1证实:
04:18:29 PM runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 04:18:30 PM 3 1288 15.13 9.40 11.92 04:18:31 PM 1 1298 15.13 9.40 11.92 04:18:32 PM 34 1298 15.13 9.40 11.92 04:18:34 PM 3 1298 15.28 9.52 11.95 04:18:35 PM 64 1302 15.28 9.52 11.95 04:18:36 PM 5 1302 15.28 9.52 11.95 04:18:37 PM 0 1302 15.28 9.52 11.95 04:18:38 PM 62 1302 15.28 9.52 11.95 04:18:39 PM 13 1302 17.26 10.03 12.10 04:18:40 PM 3 1303 17.26 10.03 12.10 04:18:41 PM 90 1302 17.26 10.03 12.10 04:18:42 PM 7 1302 17.26 10.03 12.10 04:18:43 PM 17 1302 16.12 9.91 12.05 04:18:44 PM 400 1302 16.12 9.91 12.05
结果,平均负载看起来也非常可怕(使用uptime ):
16:21:43 up 16 days, 2:16, 2 users, load average: 78.91, 28.88, 18.29
只要有一些CPU负载,一切似乎正常化:
15:18:27 up 16 days, 1:13, 1 user, load average: 0.95, 1.37, 1.81
ps r -A没有任何意思(我怀疑R或D状态下有很多进程 – 但事实并非如此):
PID TTY STAT TIME COMMAND 28947 pts/0 R+ 0:00 ps r -A
我可以排除许多短暂的生活过程。
问题:
这是更多的FYI(因为我还不能评论):运行队列计数线程,而不是进程。 要使用ps查找可运行和不可中断的睡眠线程,可以使用:
ps -eLo stat,pid,user,command | egrep "^STAT|^D|^R"
最新的内核版本(2.6.32之后)存在一个缺陷,导致系统由于负载平均计算方法的变化而导致空闲时的平均负载剧增。
欲了解更多信息,你可以检查红帽官方post 。
在bugzilla中也有一个开放的案例。