我运行一个具有24个核心的生产web服务器,其中的工作是CPU和I/O密集型的,但主要是CPU。我的脚本延迟执行时,总CPU负载是~85%或更高,以保持负载可管理。因此,CPU从未承受比我的脚本所能承受的更大的压力。
现在,我的服务器一次承受最多3小时的时间块的最大生产能力。大多数情况下,工作进展顺利,但在此期间,CPU系统负载通常会急剧增加。这是由于内核进程"events/x“、”迁移/x“和"ksoftirqd/x”,其中"x“是该进程的CPU编号。我已经读到过,这表明内核正在与排队的任务进行斗争,这些任务发生在巨大的系统负载下。然而,我的CPU负载,这是主要的瓶颈,是故意保持在~85%,以避免这类问题,正如我提到的。CPU的这种内核使用大大降低了生产速度,只会延长排队的任务。奇怪的是,大约30分钟后,系统负载将消失,内核进程的CPU使用率下降到零,但随后又开始占用CPU。在整个过程中,输入CPU的工作量没有改变,而且通常处理得很好。然而,当这些内核进程启动时,它将完全扼杀生产。
以下是其中一个事件期间“顶级-u根”的输出。用户CPU使用率为49%,因为系统使用率为40%。正常情况下,这应该是用户~85%,系统~5%。然而,没有iowait,系统平均负载为22 (24个核心),这是正常的。
top - 13:10:49 up 44 days, 20:29, 1 user, load average: 22.87, 22.73, 21.36 Tasks: 622 total, 24 running, 585 sleeping, 0 stopped, 13 zombie Cpu(s): 49.4%us, 40.3%sy, 0.0%ni, 10.1%id, 0.1%wa, 0.0%hi, 0.2%si, 0.0%st Mem: 32728060k total, 31045092k used, 1682968k free, 353768k buffers Swap: 4194300k total, 243136k used, 3951164k free, 19117436k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 51 root RT 0 0 0 0 S 11.1 0.0 436:03.06 migration/12 100 root 20 0 0 0 0 S 9.5 0.0 49:19.45 events/1 114 root 20 0 0 0 0 S 5.9 0.0 48:14.75 events/15 3 root RT 0 0 0 0 S 4.3 0.0 517:58.05 migration/0 112 root 20 0 0 0 0 S 3.6 0.0 42:00.54 events/13 27 root RT 0 0 0 0 S 2.3 0.0 200:59.58 migration/6 8149 root 20 0 165m 7732 3928 S 2.3 0.0 0:00.07 exim 15 root RT 0 0 0 0 S 2.0 0.0 450:05.62 migration/3 39 root RT 0 0 0 0 S 2.0 0.0 178:08.17 migration/9 113 root 20 0 0 0 0 S 1.6 0.0 44:00.04 events/14 178 root 20 0 0 0 0 R 1.6 0.0 53:27.57 kacpid 63 root RT 0 0 0 0 S 1.3 0.0 439:11.96 migration/15 81 root 20 0 0 0 0 S 1.0 0.0 17:14.83 ksoftirqd/19 104 root 20 0 0 0 0 S 1.0 0.0 44:58.55 events/5 115 root 20 0 0 0 0 S 1.0 0.0 47:18.46 events/16 9 root 20 0 0 0 0 S 0.7 0.0 13:56.20 ksoftirqd/1 25 root 20 0 0 0 0 S 0.7 0.0 12:46.52 ksoftirqd/5 57 root 20 0 0 0 0 S 0.7 0.0 11:12.62 ksoftirqd/13 75 root RT 0 0 0 0 S 0.7 0.0 181:00.24 migration/18 118 root 20 0 0 0 0 S 0.7 0.0 30:13.06 events/19 10497 root 20 0 77964 6244 4096 S 0.7 0.0 17:40.25 httpd
当CPU负载被严格控制为可管理时,对这些进程的行为是否有任何潜在的解释?内存不是一个问题,因为缓冲区/缓存的使用从来没有超过30%的系统容量。在搜索web时,每个人都指责系统负载过多,但是我的服务器的行为并不意味着使用的资源应该导致这种锁定。
如有任何建议,将不胜感激。
编辑:我在“答案”一节中发布了似乎是解决方案的内容。
发布于 2015-03-12 19:11:22
看来内核进程可能在交换期间占用CPU时间。服务器的缓存设置不知何故被重置,我不知道,将交换设置设置为60。从"sar -W“的输出来看,这些挂起似乎与高负荷期相吻合,在此期间,pswpin/s和pswpout/s都很大(大于2.00左右,有时高达15.00)。在将swappiness设置为1之后,我没有遇到内核进程的相同挂起,sar -W始终显示接近于零的值。总之,在高负载和大内存传输的情况下,在对资源的需求急剧变化的情况下,系统似乎陷入了困境。
发布于 2015-03-11 19:31:02
migration是处理从一个CPU到另一个CPU的进程的内核进程。
因此,由于某种原因,Linux调度程序决定进程需要移动到另一个CPU,迁移过程占用CPU时间。
您可以尝试将进程固定在特定的CPU上,或者使用内核尝试不同的调度程序。也许其他调度程序并不那么热衷于将进程迁移到其他CPU。
发布于 2015-03-11 20:11:50
我跟踪了迁移内核进程的问题,报告了这里。看来,3.6.11之前的linux内核受到了影响。在迁移过程花费大量CPU时间的情况下,链接显示了类似的症状。如果可能的话,您可能希望升级内核,看看问题是否仍然存在。
https://serverfault.com/questions/674685
复制相似问题