Linux内存清理-linux内存清理-泓源视野

Linux内存清理

创建脚本cleancache.sh

#!/bin/bash
sync
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches
创建好了脚本之后需要chmod +x cleanchache.sh 

查询服务器内存占用情况,使用命令:

du -sh /* | sort -nr

通过上边的命令查询会显示出文件的大小,再进入大小异常的文件(比如:在usr文件大小异常,进入usr,运行命令 : du -sh /usr/*|sort -nr ),这样就能定位到异常大小的文件并删除,一般情况下会是产生的日志没有及时清理导致的服务器内存不足。

 

在Linux服务器上使用Jmeter进行压测的时候,遇到了一个错误:

Linux内存清理插图根据这里的提示:

Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 1073741824 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /home/HAO/IM/hs_err_pid20194.log

去查了一下内存情况,可以看到结果如下:

[root@qatest1 IM]# free -m total used free shared buffers cached
Mem: 8001 7881 120 0 4 416
-/+ buffers/cache: 7460 541
Swap: 0 0 0

确实是内存不足了,去查一下,里面有很多不认识的服务。于是准备清理一下。

写了个脚本运行,以后可以复用:

kill -9 ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head | awk '{print $2}'

如果执行之后在查询,发现内存还是不够,可以用下面的多执行几次:

kill -9 ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head -K 50| awk '{print $2}'

再次查询,可见已经有不少可用内存了:

[root@qatest1 IM]# free -m total used free shared buffers cached
Mem: 8001 2460 5541 0 5 663
-/+ buffers/cache: 1791 6209
Swap: 0 0 0

 

下面补充一下更多的命令;

linux下获取占用CPU资源最多的10个进程,可以使用如下命令组合:

ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head

linux下获取占用内存资源最多的10个进程,可以使用如下命令组合:

ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head

命令组合解析(针对CPU的,MEN也同样道理):

ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head

该命令组合实际上是下面两句命令:

ps aux|head -1

ps aux|grep -v PID|sort -rn -k +3|head

 

 

可以使用一下命令查使用内存最多的10个进程

查看占用cpu最高的进程

ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head

或者top (然后按下M,注意这里是大写)

查看占用内存最高的进程** 

ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head

一键清理脚本kill_Xvfb.sh# ps -ef | grep Xvfb | grep -v grep | awk '{print $2}' | xargs kill -9

或者 ps -aux | grep Xvfb

或者top (然后按下P,注意这里是大写)

该命令组合实际上是下面两句命令:

ps aux|head -1
ps aux|grep -v PID|sort -rn -k +3|head

其中第一句主要是为了获取标题(USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND)。
接下来的grep -v PID是将ps aux命令得到的标题去掉,即grep不包含PID这三个字母组合的行,再将其中结果使用sort排序。
sort -rn -k +3该命令中的-rn的r表示是结果倒序排列,n为以数值大小排序,而-k +3则是针对第3列的内容进行排序,再使用head命令获取默认前10行数据。(其中的|表示管道操作)

补充:内容解释

PID:进程的ID
USER:进程所有者
PR:进程的优先级别,越小越优先被执行
NInice:值
VIRT:进程占用的虚拟内存
RES:进程占用的物理内存
SHR:进程使用的共享内存
S:进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数
%CPU:进程占用CPU的使用率
%MEM:进程使用的物理内存和总内存的百分比
TIME+:该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值。
COMMAND:进程启动命令名称

 

需要root用户运行

可以使用以下命令查使用内存最多的K个进程

方法1:

ps -aux | sort -k4nr | head -K

如果是10个进程,K=10,如果是最高的三个,K=3

说明:ps -aux中(a指代all——所有的进程,u指代userid——执行该进程的用户id,x指代显示所有程序,不以终端机来区分)

ps -aux的输出格式如下:

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 19352 1308 ? Ss Jul29 0:00 /sbin/init
root 2 0.0 0.0 0 0 ? S Jul29 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S Jul29 0:11 [migration/0]

sort -k4nr中(k代表从第几个位置开始,后面的数字4即是其开始位置,结束位置如果没有,则默认到最后;n指代numberic sort,根据其数值排序;r指代reverse,这里是指反向比较结果,输出时默认从小到大,反向后从大到小。)。本例中,可以看到%MEM在第4个位置,根据%MEM的数值进行由大到小的排序。

head -K(K指代行数,即输出前几位的结果)

|为管道符号,将查询出的结果导到下面的命令中进行下一步的操作。

方法2:top (然后按下M,注意大写)

二、可以使用下面命令查使用CPU最多的K个进程

方法1:

ps -aux | sort -k3nr | head -K

方法2:top (然后按下P,注意大写

本文由 泓源视野 作者:admin 发表,其版权均为 泓源视野 所有,文章内容系作者个人观点,不代表 泓源视野 对观点赞同或支持。如需转载,请注明文章来源。
6

发表评论

Protected with IP Blacklist CloudIP Blacklist Cloud
您是第8233674 位访客, 您的IP是:[172.70.34.63]