作者 | beyondma  责编 | 张文

来源 | CSDN 博客

头图 | CSDN 下载自视觉中国

最近笔者遇到这样一个相对比较疑难的事件,某个在 Linux 下运行的杀毒软件启动后,在某些情况下 CPU 占用率会持续升高,而且在交易量较高的情况下极易复现。而奇怪的是,我们之前已经对于杀毒软件的 CPU 使用率进行了上限限定。出现这样异常事件表明:杀毒软件并没有执行之前设定的资源占用控制策略,CPU 使用率始终持续异常偏高。

分析下来这个事件还是很有借鉴意义的。

由于此事件涉及一些敏感信息,具体不便公开的细节就不透露了,仅把可以公开的情况梳理一下,供各位读者参考。

首先我们先明确一下钩子(hook)函数的概念,简单来讲这就是一类改变其它函数行为的函数。举个简单的例子,我每次进入会议室的时候都是直接推开门然后进入的,但是现在我在进入门之前要先向向会议室主持人申请,得到许可才能进入,那么向主持人申请的动作就被 attatch 到了进入会议室这个动作上了,整个过程就可以简单的理解为 hook。

我们知道在 Linux 下想改变系统的行为,需要代码运行的内核态。比如 kprobe、fsnotify 等机制,提供了 root 用户 hook 到内核代码的权限,并最终将自己的代码段 attach 到内核调用中。

CPU 使用率过高的原因分析

经确认这款杀毒软件的 CPU 占用率控制模型如下图,其守护模块会定时判断 agent 资源使用情况,如果超标则将释放扫描模块使用的 CPU 与内存资源。

但是具体分析下来,这样的机制在 IO 频繁的系统上存在缺陷,具体原因扫描模块在内核态下执行时下无法释放 CPU 资源。

分析过程如下:

经确认杀毒软件 agent 在行为监测时,在进程将文件加载到内存前,会使用 hook 技术对于 open 等系统调用进行 attach,确定加载的文件不含恶意代码后,才允许进程加载该文件。因此在 Linux 内核找到系统调用的 attatch 机制的相关代码进行分析。

1. 系统调用中 sys_open 函数,使用 fsnotify 机制对于 attach 注入到 sys_open 函数的进程进行回调通知。(具体代码位置在 kernel/open.c)

2. attach 到 sys_open 的代码执行过程始终是处于内核态中的,同时 Linux 的 fsnotify 机制也会加内核锁,在内核锁解锁前该进程无法释放 CPU,不能被打断。(具体代码位置在 kernel/fsnotify.c)

杀毒软件扫描模块 attach 内核函数的机制与 fsnotify 类似,因此其扫描模块在进行行为检测时会在内核态执行且不能被打断,而在系统中原本就有大量 IO 操作的情况下,守护模块将失效。

在 POC 测试时,该杀毒软件在文件扫描时其 CPU 占用率始终不高,这其中的原因是由于在扫描文件时该杀毒软件全部运行于用户态下,不存在内核态运行的情况,因此守护模块可正常调节 CPU 使用情况。

解决方案浅析

先说一下实测结论:在加入 attach 延时操作后,IO 吞吐量巨幅下降。经访照该杀毒软件的机制进行实测模拟,在内核 sys_open 函数 attach 加入延时操作,观察对于系统 IO 的影响。

在加入将内核 sys_open 延时一倍的操作后,我在华为的在鲲鹏 4C/8G 的平台实测上,每秒钟文件打开、关闭文件操作的次数,由每秒 867次 的峰值下降到了 72 次,出现了 90%以上的下降。这可能与内核锁的雪崩效应有关。

经确认,在之前的版本之所以没有出现问题,是由于当守护进程在确认 CPU 调节失效后会对自身 agent 进行整体自毁操作(modelu_exit),因此不会触发类似于 CPU 占用率持续升高的案例。

那么针对这样的机制具体的解决方案如下:

  1. 对于内核态代码执行,加入全局并发数限制,对于所有执行在内核态的扫描线程,进行全局并发锁限制,具体并发数的设置还需要进行进一步测试后得出结果,在鲲鹏 4C/8G 的平台上测试最大并发数设置为 4 基本不会对系统正常调用产生影响,建议先将系统 CPU 个数设定为最大并发数,进行测试。

  2. 对于对于内核态代码执行加入每秒执行次数限制,对于所有执行在内核态的扫描线程,进行全局的执行次数限制,加入执行令牌,每秒执行次数不应该大于最大 IO 数量的 10%,在此方案下也可避免对于系统正常调用的影响。

  3. 加入扫描任务调度机制:避免在内核态执行耗时的扫描任务,只是快速收到系统的 open 调用指令后,将相关的扫描任务加入调试队列,就立刻返回,在用户态统一执行扫描任务,也可避免由于代码长时间运行于内核态造成的问题。

声明:本文为作者独立观点,不代表 CSDN 立场。

程序员如何避免陷入“内卷”、选择什么技术最有前景,中国开发者现状与技术趋势究竟是什么样?快来参与「2020 中国开发者大调查」,更有丰富奖品送不停!

☞《英雄联盟》出现大面积闪退;两名 95 后大学生用脑电波写“福”字;Windows蓝屏为什么是蓝底白字?| 极客头条☞一行代码没写,凭啥被尊为“第一位程序员”?
☞程序员硬核“年终大扫除”,清理了数据库 70GB 空间
☞“我用 72 小时复刻了一个 ClubHouse”

Linux 下杀毒软件 CPU 占用率为何持续升高相关推荐

  1. Linux 下杀毒软件 CPU 占用率为何持续升高?

    作者 | beyondma  责编 | 张文 来源 | CSDN 博客 头图 | CSDN 下载自视觉中国 最近笔者遇到这样一个相对比较疑难的事件,某个在 Linux 下运行的杀毒软件启动后,在某些情 ...

  2. 疑难杂症:Linux下杀毒软件CPU占用率为何持续升高

    最近笔者遇到这样一个相对比较疑难的事件,某个在Linux下运行的杀毒软件启动后在,某些情况下CPU占用率会持续升高,而且在交易量较高的情况下极易复现.而奇怪的是我们之前已经对于杀毒软件的CPU使用率进 ...

  3. Linux下解决CPU占用率100%问题的步骤

    CPU占用率100%问题的解决步骤 1. 确定cpu占用率高的进程ID - PID 2. 查看进程中cpu占用率高的线程ID - TID 3. 将线程ID - TID 转换成16进制 - XTID 4 ...

  4. Linux环境下如何计算CPU占用率

    1.Linux 环境下查看 CPU 信息 1.1.查看 CPU 详细信息 通过 cat /proc/cpuinfo 命令,可以查看 CPU 相关的信息: [root@rh ~]$ cat /proc/ ...

  5. Linux系统中CPU占用率过高问题原因分析

    背景: 在服务器上部署了一个项目,发现项目部署完成之后,CPU占用率居高不下,现将原因分析过程总结如下: 通过top命令查看CPU占用率,分析CPU占用过高的原因 步骤一: 通过top命令,查看占用C ...

  6. linux看线程占用率,查看linux线程的CPU占用率

    测试代码如下: #include #include void *thread_routine(void *arg) { prctl(PR_SET_NAME, "child_thread&qu ...

  7. linux c 控制cpu占用率

    之前在<编程之美>上提到说控制cpu的使用率使能在任务管理器上画一条正弦线 现在下面提供一个在Linux平台上实现的控制cpu频率在某个值 cpu_load.c #include < ...

  8. 联想T460 Win10下“系统中断”CPU占用率高的解决办法

    问题描述:如题所示 解决办法:到Lenovo官网下载与笔记本对应的最新BIOS,更新后即可解决. 转载于:https://blog.51cto.com/petrelight/1974138

  9. Linux环境下程序的多核CPU占用率高的问题分析和解决

    1.项目问题 前端PDC双目倾斜相机客流统计项目中排查平台服务程序延时大的问题时,平台demo程序测试发现多核cpu中的某个核的占用率达到100%,导致组件中的目标检测线程和客流统计线程的单帧耗时达不 ...

最新文章

  1. 从风投那里得到了了 $100W 的种子期投资且已到账,我该如何组建公司及团队?...
  2. TaskExecutor设计与实现
  3. 机会:新兴产业+大消费(转载)
  4. Git 分支管理和冲突解决
  5. 有效的数据处理:使用Tango库进行压缩和加密
  6. restful api接口规范_Restful API设计规范
  7. 记一个linux内核内存提权问题
  8. redis、kafka、rabittMQ对比 (转)
  9. 教你怎么批量修改文件后缀名
  10. Logstash详解之——input模块
  11. 践行社会责任的路上,中概股们看到了怎样的风景?
  12. Codeforces 480D Parcels(dp)
  13. python美元和人民币双向兑换程序_Python:程序练习题(二)
  14. 通过单击按钮实现全屏、退出全屏
  15. 数据解读 | 广东省内,谁才有资格做下一个深圳?
  16. 软件测试/测试开发丨学习Docker就应该掌握的dockerfile语法与指令
  17. 快递行业前景:2022年市场迎来了发展新纪元
  18. mysql的环境搭建
  19. 用c语言编写两个数的最小公倍数,用C语言编写程序求两个数的最小公倍数,并输出...
  20. 模拟cmos集成电路(5)

热门文章

  1. sublime运行node.js报[Decode error - output not cp936]错误
  2. JSP和Servlet
  3. bootstrapTable 取消 “正在加载中...”
  4. Bug错误一:报this.setData is not a function错误
  5. JavaScript基本数据类型和引用数据类型
  6. 在线编辑word文档 可保存到服务器(转)
  7. oracle中结果集合并
  8. 使用sqoop导出mysql数据时错误处理【com.mysql.jdbc.RowDataDynami】
  9. HDU.1000 A + B Problem
  10. [NVIDIA] Ubuntu 16.04 安装 nvidia-384 + cuda-9.0