场景:
最近生产上的一台阿里云ECS服务器遭遇病毒攻击,导致内存总是占满,重启了也没用,最崩溃的时候直接无法连接,还是在阿里云提交了工单让工程师处理了以后才能继续连接,可是内存占满的问题依然没有解决,最终也是搜了不少资料以后才得以解决。排查:
1、登录问题Linux服务器。
2、执行free和top命令,没有找到占用大量内存的进程。
3、执行如下命令,统计所有进程占用的物理内存,相加后与free命令结果进行核对,没有找到占用大量内存的进程。
ps aux|awk '{sum+=$6} END {print sum/1024}'
4、进一步排查进程消耗内存,执行如下命令,根据rss列排序结果,核实最大消耗内存进程,未查找出异常进程
ps -eo pid,rss,pmem,pcpu,vsz,args --sort=rss
5、继续执行以下操作,检测slab内存分配器占用情况,执行如下命令,未发现异常
cat /proc/meminfo | awk '{sum=$2/1024} {print $1 sum " MB"}'
注:以上命令执行过程中将默认的KB单位换算为了MB单位。
6、安装atop工具观察系统资源使用详细信息。
yum install atop
注意:内存已经接近满的情况下,是没有办法直接使用上面的命令安装atop工具的,会提示
virtual memory exhausted: Cannot allocate memory
所以顺便说一下,在内存已经接近满的情况下如何安装 atop工具 ?
解决办法:安装前先用swap扩展内存,扩展结束以后再进行安装
dd if=/dev/zero of=/opt/images/swap bs=1024 count=2048000
mkswap /opt/images/swap
swapon /opt/images/swap
free -m
下载源码包
wget http://www.atoptool.nl/download/atop-2.3.0.tar.gz
解压:
tar -zxvf atop-2.3.0.tar.gz
进入解压目录:
cd atop-2.3.0
编译安装:
make
#CentOS 7执行:
make systemdinstall
#CentOS 7前的版本请执行:
make prefix=/usr/local/atop install
make install
安装报错解决
若未安装gcc,执行:
yum install -y gcc
若提示zlib.h: No such file or directory,安装zlib:
wget http://zlib.net/zlib-1.2.11.tar.gz
tar -zxvf zlib-1.2.11.tar.gz
cd zlib-1.2.11
./configure --shared
make test
make install
cp zutil.h /usr/local/include
cp zutil.c /usr/local/include
使用完毕后可以关掉swap:
swapoff swap
rm -f /opt/images/swap
7、atop工具安装完后,执行atop命令后,发现MEM那一行, hptot 占用了几乎所有内存(忘记留图了,只能语言描述),查资料以后发现是大页缓存,关闭大页缓存后,内存释放。
vi /etc/sysctl.conf
vm.nr_hugepages = 0
vm.nr_hugepages_mempolicy = 0
手动执行命令让参数生效:
sysctl -p
8、内存可用后,我通过history命令发现有病毒攻击命令
该命令就是在服务器上下载了一个xms脚本,然后篡改了sysctl.conf文件,导致使用大页缓存将内存沾满,访问该地址可以得到病毒脚本,仔细看病毒脚本中框出来的命令: