Linux 服务器高负载峰值

Linux 服务器高负载峰值

我在 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进行一些文件锁定。fcntlflock

如果再次遇到此问题,您可以尝试执行类似操作来打印出卡住进程的整个内核堆栈。它通常会在回溯中产生更多与卡住文件系统相关的信息。

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文件系统的速度非常慢。

或者,您遇到了与锁定有关的内核错误 —— 这种问题(通常)会被捕获,因此您可能发现只需更新到最新内核并重新启动即可解决问题并消除错误。

相关内容