进程kswapd0与events/0消耗大量CPU的问题

运维 系统运维
重启服务器后,使用 top 命令看看是哪些进程消耗那么大的 CPU 使用。当 mysql 的 CPU 消耗降下来之后,出现了两个奇怪的进程:kswapd0 和 events/0。

今天下午网站宕了两次机,发工单给阿里云,发现原因是服务器的CPU 100%了。

重启服务器后,使用 top 命令看看是哪些进程消耗那么大的 CPU 使用。盯了有好十几分钟,主要消耗 CPU 的进程有两个,一个是 mysql,另一个是 apache。下面的图可以看到,mysql 占用了很大部分的 CPU 使用。apache 单个进程虽然占得不多,但有不少个 apache 进程同时存在,也消耗了不少 CPU 的使用。

当然,这些不足以让服务器的 CPU 直接跑满挂掉,后来发现了两个大家伙:

当 mysql 的 CPU 消耗降下来之后,出现了两个奇怪的进程:kswapd0 和 events/0。

1. kswapd0

 Linux uses kswapd for virtual memory management such that pages that have been recently accessed are kept in memory and less active pages are paged out to disk.

 (what is a page?)…Linux uses manages memory in units called pages.

 So,the kswapd process regularly decreases the ages of unreferenced pages…and at the end they are paged out(moved out) to disk

kswapd0进程的作用:它是虚拟内存管理中,负责换页的,操作系统每过一定时间就会唤醒kswapd ,看看内存是否紧张,如果不紧张,则睡眠,在 kswapd 中,有2 个阀值,pages_hige 和 pages_low,当空闲内存页的数量低于 pages_low 的时候,kswapd进程就会扫描内存并且每次释放出32 个free pages,直到 free page 的数量到达pages_high。

查看内存使用率,发现内存确实不够用,有时候已经使用到了swap。

2. events/0

另一个进程 events/0 是工作者线程,主要是用来执行delay work的。先简单介绍一下。

我们都知道中断的底半部机制有三种:软中断、tasklet和工作队列。其中软中断很少使用,内核中只有网络在使用,它的延时是最小的。

tasklet是软中断的一个应用,所有线程注册的tasklet都会顺序被执行。因此tasklet的执行环境是软中断上下文,所以不能阻塞或者睡眠。一般情况下,tasklet的延迟也很小,可以满足大部分需求。

要是底半部中可能睡眠,那么只好使用工作队列了。工作队列其实是把要做的底半部的函数交给内核的专门线程去调用。这样工作队列就运行于线程环境了,不怕睡眠。当然,睡眠会影响注册到同一线程的其它底半部的执行,但不会引起大的问题。每个CPU都有一个线程(events/n,n是编号)负责执行工作队列,第一个CPU的线程是events/0,如果是双核的,还会有一个events/1线程。程序使用了工作队列,所以每次执行都会多出一个events/0(第一个CPU上工作线程)。

内核的软中断辅助处理线程ksoftirqd/n(n是CPU编号),它们负责出发软中断中触发的软中断。它们将重新触发软中断放在系统空闲时调用,而不是马上。这样用户空间不至于饥饿,重新触发的软中断也得以尽快执行。(《Linux内核设计与实现》85页)


宕机原因显而易见了,physical mem 不足,引起 swap 频繁。其实这也是 VPS 使用上的一个常见的问题了,通常是由 Apache 占用内存过多引起的。kswapd0 是系统的虚拟内存管理程序,如果物理内存不够用,系统就会唤醒 kswapd0 进程,由 kswapd0 分配磁盘交换空间作缓存,因而占用大量的 CPU 资源。重启Apache,释放内存,问题就会消失。但这不是长久之计,最好的方法还是花点钱升级下内存。我也知道随着访问量的不断上涨,肯定要升级下内存,但是没想到这个问题这么快就来了……

吐槽一下,虽然网站现在的规模也不算很大,但是慢慢也开始吃服务器的硬件了。CPU和内存接下来也需要升级,一个人维护这么一个站点还真的各种操心。

 

责任编辑:奔跑的冰淇淋 来源: Veda原型
相关推荐

2023-12-12 17:46:33

系统kswapd0内核

2020-08-03 14:17:34

CPU内存系统运维

2011-03-23 14:42:47

CPU过度消耗

2022-05-27 11:59:22

Linux内存CPU

2017-01-12 15:17:27

线程CPU定位

2022-07-22 12:02:20

勒索软件H0lyGh0st

2021-07-21 08:45:16

do{...} whi代码语言

2023-05-10 16:15:58

javaScript算法开发

2021-04-13 07:58:38

背包代码模式

2019-06-03 10:30:42

MySQLCPU数据库

2023-02-26 00:42:08

表问题内存表PFS

2010-09-08 14:46:36

CSSborder

2010-09-06 16:00:41

CSSborder

2022-09-22 07:31:14

Java变量计算

2022-01-17 13:31:53

value背包解法

2018-11-01 10:59:52

Linux内存进程

2021-11-29 20:44:31

Linux内存进程

2020-03-19 15:10:02

MySQLCPU数据库

2021-02-05 07:16:13

C语言负数的存储

2019-12-16 10:43:38

Linux内存消耗进程
点赞
收藏

51CTO技术栈公众号