我在 Linux 服务器(Ubuntu 18.04、16 核、8GB Ram)上面临高负载峰值:它是一个带有 apache 2.4、php7.2-fpm 和 memcached 的网络服务器,没有数据库服务(由不同的服务器提供)。
这些尖峰非常快并且持续几秒钟, 这就是热门节目
一开始我以为是 CPU 使用率异常,但如图所示,没有任何进程占用过多 CPU,RAM 使用率也相对较低(25%)。问题似乎出在 wa 上,wa 非常高!
我尝试使用 iotop 调查它是否依赖于 I/O 存储问题,但似乎当这些峰值发生时,I/O 读取或写入并没有增加。
这些峰值在一天内发生多次,经过一些监控,我发现它们发生在特定时间。我检查了是否存在计划在特定时间运行的进程,但没有发现任何东西。
我知道其他高负载原因也可能取决于高带宽使用率,但我该如何监控这一点?
我对 iostat o sar 不是很有经验,它们是解决我的问题的“正确方法”吗?
作为马修·伊夫建议我在高负载时刻尝试一下ps -ALo pid,tid,comm,wchan
,它给出了一些有趣的输出:
35227 35227 kworker/12:2 worker_thread
53730 53730 kworker/7:0 worker_thread
57306 57306 php-fpm7.2 poll_schedule_timeout
57348 57348 php-fpm7.2 poll_schedule_timeout
57988 57988 php-fpm7.2 poll_schedule_timeout
58251 58251 php-fpm7.2 poll_schedule_timeout
60181 60181 kworker/5:2 worker_thread
62158 62158 kworker/2:1 worker_thread
62169 62169 php-fpm7.2 poll_schedule_timeout
65001 65001 php-fpm7.2 poll_schedule_timeout
69262 69262 php-fpm7.2 poll_schedule_timeout
69647 69647 kworker/6:1 worker_thread
72110 72110 php-fpm7.2 call_rwsem_down_write_failed
72638 72638 php-fpm7.2 skb_wait_for_more_packets
72845 72845 php-fpm7.2 call_rwsem_down_write_failed
72848 72848 php-fpm7.2 call_rwsem_down_write_failed
72850 72850 php-fpm7.2 skb_wait_for_more_packets
72892 72892 php-fpm7.2 skb_wait_for_more_packets
72909 72909 kworker/u256:2 worker_thread
72940 72940 kworker/u256:4 get_write_access
73353 73353 top poll_schedule_timeout
73367 73367 php-fpm7.2 locks_lock_inode_wait
73659 73659 php-fpm7.2 call_rwsem_down_write_failed
73950 73950 php-fpm7.2 skb_wait_for_more_packets
73953 73953 php-fpm7.2 call_rwsem_down_write_failed
74259 74259 php-fpm7.2 skb_wait_for_more_packets
74345 74345 php-fpm7.2 skb_wait_for_more_packets
74436 74436 kworker/13:1 worker_thread
74481 74481 kworker/u256:1 get_write_access
74519 74519 php-fpm7.2 skb_wait_for_more_packets
74522 74522 php-fpm7.2 skb_wait_for_more_packets
74576 74576 php-fpm7.2 call_rwsem_down_write_failed
74578 74578 php-fpm7.2 skb_wait_for_more_packets
74603 74603 php-fpm7.2 locks_lock_inode_wait
74849 74849 php-fpm7.2 skb_wait_for_more_packets
75085 75085 php-fpm7.2 skb_wait_for_more_packets
75088 75088 php-fpm7.2 call_rwsem_down_write_failed
75100 75100 php-fpm7.2 call_rwsem_down_write_failed
75171 75171 php-fpm7.2 skb_wait_for_more_packets
75283 75283 kworker/2:2 worker_thread
....
这是否意味着文件系统或存储存在问题?
答案1
有几件事让我印象深刻
kworker/u256:1 get_write_access
php-fpm7.2 call_rwsem_down_write_failed
php-fpm7.2 locks_lock_inode_wait
这告诉您正在使用或php
进行一些文件锁定。fcntl
flock
如果再次遇到此问题,您可以尝试执行类似操作来打印出卡住进程的整个内核堆栈。它通常会在回溯中产生更多与卡住文件系统相关的信息。
for p in $(ps -ho pid,wchan $(pgrep php-fpm7.2) | grep -E 'locks_lock_inode_wait|call_rwsem_down_write_failed' | awk '{print $1}'); do
echo $p
cat /proc/$p/stack
echo
done
当发生这种情况时,运行lslocks
命令并查看哪些文件被锁定以及在哪里被锁定。
这篇文章中的信息还不足以确定发生了什么或为什么会出现问题。你可能以某种方式设法打开了无数个锁或做了一些奇怪的事情。
这也可能与文件系统本身的文件锁定错误有关。但我敢打赌,这是某些远程文件系统或某些fuse
文件系统的速度非常慢。
或者,您遇到了与锁定有关的内核错误 —— 这种问题(通常)会被捕获,因此您可能发现只需更新到最新内核并重新启动即可解决问题并消除错误。