linux cpu使用率_linux < 4.19 在 cache 使用过多时 CPU 使用率飙高

我司有几台 Ubuntu 16.04 的 Kubernetes worker node,不时的发生个别容器 CPU 使用飙升但是服务性能很低的情况,之前发现 4.4.0-117-generic 发现有内核 bug 报告 “kernel: SLUB: Unable to allocate memory on node -1”,怀疑之下升级到了 Ubuntu 16.04 里自带的 4.15.0-76-generic, 好景不长,容器 CPU 突然飙升的情况还是偶有发生,还引发了一次严重的生产事故,堪称血泪。

用 perf top 看了下,有个可疑的内核函数 overhead 很高:

c796ac68315e7bc16c1c2d805fcd0edb.png

然后搜索了下,发现一点线索:

  1. https://forum.proxmox.com/threads/linux-kernel-list_lru_count_one-patch.52591/
  2. https://lkml.org/lkml/2018/7/9/181
  3. https://www.spinics.net/lists/linux-mm/msg158019.html

描述的问题跟我们观察到的很像:

  1. cpu 莫名飙高
  2. 内核函数 list_lru_count_one 的 overhead 很高
  3. free 命令显示 cache + buffer 很高,free 很少

我们部分服务用到了 slf4j 的 ch.qos.logback.classic.AsyncAppender ,这个东西好像从来不 flush,导致 memory cgroup 里的 memory.stat 里的 cache 一直增长没个头,可能是这个行为慢慢就触碰到了 linux 内存管理的这个 bug 激发的条件。

解决办法就是升级到 linux >= 4.19 内核了,真是为 Linux 内核代码质量捉急!

BTW,在 CentOS 7.4.1708 + linux 3.10.0-693.2.2.el7.x86_64 上试验了第二个链接的复现命令,在那个 for loop 执行到近 2000 时系统 load 到了 2000 左右,几乎不能响应,然后最后居然执行完了 for loop,立马 time echo 3 > /proc/sys/vm/drop_caches 居然非常快,要么是 linux 3.10 还没引入这个 bug,要么是 Redhat 牛逼打了自己补丁修正了。

`sem_timedwait` 是 Linux 系统下的 semaphore(信号量)库函数,用于在给定的时间超时后等待一个信号量变为可用。Semaphore 是一种同步机制,在并发编程中用于控制对共享资源的访问。 下面是一个简单的例子,展示了如何在 Linux使用 `sem_timedwait` 函数: ```c #include <stdio.h> #include <stdlib.h> #include <semaphore.h> #define SEMAPHORE_KEY 12345 int main() { sem_t sem; // 创建一个信号量 int result; // 初始化信号量 if (sem_init(&sem, 0, 1)) { // 第一个参数是信号量结构体,第二个表示二进制模式,第三个初始化值 perror("sem_init failed"); return -1; } // 主进程创建一个临界区并尝试获取信号量 printf("Main process attempting to acquire semaphore...\n"); struct timespec timeout = {0, 500 * 1000}; // 设置超时时间为半秒 result = sem_timedwait(&sem, &timeout); // 如果信号量未可用,则最多等待半秒 if (result == -1 && errno != ETIMEDOUT) { // ETIMEDOUT 表示超时 perror("sem_timedwait failed"); } else { printf("Got the semaphore!\n"); // 进行需要互斥操作的任务... // 当完成任务后,调用 sem_post 来释放信号量 sem_post(&sem); } // 最终关闭信号量 sem_destroy(&sem); return 0; } ``` 在这个例子中,主进程首先创建一个信号量,并设置其初始值为1(代表有一个资源)。然后尝试获取这个信号量,如果当前无可用资源则会等待半秒。当获取到信号量后,可以进入临界区执行需要互斥的操作,完成后再通过 `sem_post` 释放信号量,允许其他线程也获取该信号量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值