高级运维工程师带你解决生产服务器某软件进程占用过高物理内存实战案例全网唯一
一、生产事故描述
应用java程序报内存溢出,redis也爆内存不足!操作系统内存剩余不足,很典型服务器内存不足,但是实际情况是java与redis已经设置最大内存限制,那剩余50%内存是那个进程占的呢?这个软件的进程与Java进程跟redis进程跟操作系统互相争夺内存!我们遇到这类问题怎么排查?笔者我给个思路与方法!
二、监控分析方法
进入linux服务器 top命令
top
在 Linux 系统中,top
命令用于显示系统的负载情况。top
命令的输出包含了很多方面的数据,例如 CPU、内存、系统的任务等。其部分字段含义如下:
- VIRT:virtual memory usage,进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等。
- RES:resident memory usage,进程当前使用的内存大小,但不包括
swap out
。 - SHR:shared memory,除了自身进程的共享内存,也包括其他进程的共享内存。
- DATA:数据占用的内存,如果
top
没有显示,按f
键可以显示出来。
你可以通过top
的内部命令对进程的显示方式进行控制。如:
s
:改变画面更新频率。l
:关闭或开启第一部分第一行top
信息的表示。t
:关闭或开启第一部分第二行Tasks
和第三行Cpus
信息的表示。m
:关闭或开启第一部分第四行Mem
和第五行Swap
信息的表示。N
:以 PID 的大小的顺序排列表示进程列表。P
:以 CPU 占用率大小的顺序排列进程列表。M
:以内存占用率大小的顺序排列进程列表。h
:显示帮助。n
:设置在进程列表所显示进程的数量。q
:退出top
。
如果你想了解更多关于top
命令的信息,可以继续向我提问。
按占用内存排序只取前5名
在 Linux 系统中,你可以使用top
命令来查看进程的内存使用情况,并按照内存占用率进行排序。具体步骤如下:
- 打开终端窗口,并输入以下命令:
按下回车键后,你将看到一个实时更新的进程列表。默认情况下,进程按照 CPU 使用率排序。top
- 要按照内存使用率排序,可以按下 Shift + M 键。接下来,你将看到占用内存最高的进程列表。
- 通常,列表的第一行是系统进程,可以忽略。你需要关注的是列表中的前五个进程,它们是占用内存最高的进程。
每个进程的信息包括进程 ID(PID)、用户、CPU 使用率、内存使用率、进程名称等。你可以根据需要查看更多详细信息,例如进程的命令行参数、线程数等。
然后主意排查可疑的进程,按进程名去逐一排查!
三、笔者实际案例解决介绍
笔者用的是麒麟V10操作系统
一、核实操作系统信息
银河麒麟高级服务器操作系统简介:
银河麒麟高级服务器操作系统V10是针对企业级关键业务,适应虚拟化、云计算、大数据、工业互联网时代对主机系统可靠性、安全性、性能、扩展性和实时性等需求,依据CMMI5级标准研制的提供内生本质安全、云原生支持、自主平台深入优化、高性能、易管理的新一代自主服务器操作系统;同源支持飞腾、龙芯、申威、兆芯、海光、鲲鹏等自主平台;应用于政府、国防、金融、教育、财税、公安、审计、交通、医疗、制造等领域。
uname -a
Linux localhost.localdomain 4.19.90-23.8.v2101.ky10.x86_64 #1 SMP Mon May 17 17:08:34 CST 2021 x86_64 x86_64 x86_64 GNU/Linux
cat /proc/version
Linux version 4.19.90-23.8.v2101.ky10.x86_64 (KYLINSOFT@localhost.localdomain) (gcc version 7.3.0 (GCC)) #1 SMP Mon May 17 17:08:34 CST 2021
cat /etc/os-release
NAME="Kylin Linux Advanced Server"
VERSION="V10 (Tercel)"
ID="kylin"
VERSION_ID="V10"
PRETTY_NAME="Kylin Linux Advanced Server V10 (Tercel)"
ANSI_COLOR="0;31"
二、分析出占用最大可疑进程
麒麟V10 mate-indicators、 auditd进程占用内存过高问题
查看麒麟版本V10版本、开源补丁包链接、内存泄漏临时处理和永久处理方法
mate-indicators
mate-indicators是指在麒麟操作系统中使用的一种指示器应用程序。它提供了一些常用的系统指示器,例如电池电量、音量、网络连接等,以便用户可以方便地查看和控制这些系统状态。
auditd
auditd是Linux系统中的一个工具,用于监控系统的安全审计日志。它可以记录系统中发生的各种事件,如文件访问、用户登录、进程创建等,并将这些事件记录到日志文件中,以供后续分析和审计。
临时解决:
systemctl restart lightdm.service
systemctl stop auditd.service
升级插件包彻底解决
麒麟系统离线下载地址:
https://update.cs2c.com.cn/NS/V10/V10SP2/os/adv/lic/updates/x86_64/Packages/
audispd-plugins-zos-3.0-5.se.12.ky10.x86_64.rpm 04-Nov-2022 06:59 20K
audit-3.0-5.se.12.ky10.x86_64.rpm 04-Nov-2022 06:59 171K
audit-devel-3.0-5.se.12.ky10.x86_64.rpm 04-Nov-2022 07:00 135K
audit-help-3.0-5.se.12.ky10.noarch.rpm 04-Nov-2022 06:59 123K
audit-libs-3.0-5.se.12.ky10.x86_64.rpm 04-Nov-2022 07:00 99K
python2-audit-3.0-5.se.12.ky10.x86_64.rpm 04-Nov-2022 07:00 71K
python3-audit-3.0-5.se.12.ky10.x86_64.rpm 04-Nov-2022 07:00 71K
mate-indicators-20150918kord0ukui58-10.p07.ky10..> 08-Oct-2021 04:01 217K
rpm -ivh ./*.rpm
rpm -ivh mate-indicators-20150918kord0ukui58-10.p07.ky10.x86_64.rpm
rpm -qa
systemctl restart lightdm.service
升级插件之后在观察内存占用情况!
四、 补充:操作系统分析占用cpu最大的可疑进程分析
有些挖矿病毒,或者杀毒软件也会占用cpu过高,引起生产应用事故!
下面方法是过滤出可惜的占用操作系统CPU过高的进程!
查看获取占CPU的最大的进程ID
ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head #查看占用 CPU 最高的前10个进程
有些挖矿病毒可以这样方式排查出来
ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head #查看占用内存(MEM)最高的前10个进程
kill -9 1488 #1488为进程ID
有些挖矿病毒杀掉进程会自动重启,杀不掉,直接删除掉病毒命令,用最高权限!
rm -rf /root/./sshc #发现./sshc为病毒的脚本,删除
下图是怎么看进程的文件路径:
笔者简介
国内某一线知名软件公司企业认证在职员工:任JAVA高级研发工程师,大数据领域专家,数据库领域专家兼任高级DBA!10年软件开发经验!现任国内某大型软件公司大数据研发工程师、MySQL数据库DBA,软件架构师。直接参与设计国家级亿级别大数据项目!并维护真实企业级生产数据库300余个!紧急处理数据库生产事故上百起,挽回数据丢失所造成的灾难损失不计其数!并为某国家级大数据系统的技术方案(国家知识产权局颁布)专利权的第一专利发明人!