linux内存不足解决办法
///这一部分存在疑问
查看目录下文件夹大小
du -h --max-depth=1
看具体哪个文件夹占用内存过高,一般是日志,删除即可。
///这一部分存在疑问,上面的文件夹可以代表内存吗?
内存不够
top 命令 看内存占用情况
若buff/cache占用过高,则执行以下命令清缓存(需ROOT权限)
先执行sync,先把buffe中的数据先写入到硬盘中。
echo 1 > /proc/sys/vm/drop_caches:表示清除pagecache。
echo 2 > /proc/sys/vm/drop_caches:表示清除回收slab分配器中的对象(包括目录项缓存和inode缓存)。slab分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的pagecache。
echo 3 > /proc/sys/vm/drop_caches:表示清除pagecache和slab分配器中的缓存对象。
此处请参考:
echo N>/proc/sys/vm/drop_caches清理缓存_echo >1 /proc/_persistent_db的博客-CSDN博客
查看内存占用top10
ps auxw|head -1;ps auxw|sort -rn -k3|head -10
经过以上步骤,再次查看内存
Linux中top信息
一.信息显示
Linux系统可以通过top命令查看系统的运行状态,包括负载,内存使用(交换分区),CPU使用、当前运行的线程,进程等信息。
[root@localhost home]# top -help procps-ng version 3.3.10 Usage: top -hv | -bcHiOSs -d secs -n max -u|U user -p pid(s) -o field -w [cols]
参数说明:
- d 指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变之。
- p 通过指定监控进程ID来仅仅监控某个进程的状态。
- q 该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行。
- S 指定累计模式
- s 使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。
- i 使top不显示任何闲置或者僵死进程。
- c 显示整个命令行而不只是显示命令名
执行top,可以看到某一时刻,系统的运行状况,默认在3秒后刷新显示,这个可以动态设置(上面的 -d 参数)。
[root@localhost home]# top
top - 11:09:00 up 324 days, 17:24, 1 user, load average: 0.38, 0.38, 0.37 Tasks: 136 total, 1 running, 135 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.9 us, 0.5 sy, 0.0 ni, 98.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 16267100 total, 1142448 free, 7907452 used, 7217200 buff/cache KiB Swap: 0 total, 0 free, 0 used. 7969352 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 5466 elastic+ 20 0 7503920 1.508g 39564 S 4.0 9.7 4:46.62 java 9544 root 20 0 1306232 190444 6404 S 2.0 1.2 4425:19 mongod 314 root 20 0 9.767g 2.185g 15568 S 1.3 14.1 48:34.56 java 12447 kibana 20 0 1293128 116832 7316 S 1.0 0.7 1061:09 node 28899 root 20 0 134904 9940 5288 S 1.0 0.1 1120:54 AliYunDun 10170 root 20 0 2025680 60264 4848 S 0.7 0.4 3641:19 mongod 315 root 20 0 0 0 0 S 0.3 0.0 233:17.75 jbd2/vda1-8 5328 root 20 0 9870984 281836 16864 S 0.3 1.7 0:20.55 java 5620 root 20 0 157720 2256 1556 R 0.3 0.0 0:01.57 top 10737 root 20 0 138976 9636 1204 S 0.3 0.1 1236:17 redis-server 10751 root 20 0 141024 11624 1080 S 0.3 0.1 764:46.02 redis-server 10757 root 20 0 136924 7752 1308 S 0.3 0.0 1305:56 redis-server 10764 root 20 0 175840 41360 1348 S 0.3 0.3 781:07.92 redis-server 10769 root 20 0 175840 46616 1300 S 0.3 0.3 760:02.02 redis-server 10775 root 20 0 136928 7652 1204 S 0.3 0.0 1220:41 redis-server 17817 mysql 20 0 3872248 346428 6344 S 0.3 2.1 56:03.08 mysqld 1 root 20 0 43600 3416 1880 S 0.0 0.0 6:32.62 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.08 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:33.96 ksoftirqd/0 5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H 7 root rt 0 0 0 0 S 0.0 0.0 0:02.52 migration/0 8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh 9 root 20 0 0 0 0 S 0.0 0.0 1298:19 rcu_sched 10 root rt 0 0 0 0 S 0.0 0.0 3:05.07 watchdog/0 11 root rt 0 0 0 0 S 0.0 0.0 2:42.85 watchdog/1 12 root rt 0 0 0 0 S 0.0 0.0 0:02.70 migration/1 13 root 20 0 0 0 0 S 0.0 0.0 0:40.06 ksoftirqd/1 15 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/1:0H 16 root rt 0 0 0 0 S 0.0 0.0 2:40.06 watchdog/2 17 root rt 0 0 0 0 S 0.0 0.0 0:03.58 migration/2 18 root 20 0 0 0 0 S 0.0 0.0 0:36.39 ksoftirqd/2 20 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/2:0H 21 root rt 0 0 0 0 S 0.0 0.0 2:38.38 watchdog/3 22 root rt 0 0 0 0 S 0.0 0.0 0:03.58 migration/3 23 root 20 0 0 0 0 S 0.0 0.0 0:33.11 ksoftirqd/3 25 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/3:0H
第一行:这行显示的信息与命令uptime显示的信息相同
top - 11:09:00 up 324 days, 17:24, 1 user, load average: 0.38, 0.38, 0.37
对应的信息:系统当前时间 up 系统到目前为止运行的时间, 当前系统的登陆用户数量,load average后面的三个数字分别表示距离现在一分钟,五分钟,十五分钟的负载情况。
注意:load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。
第二行:任务进程
Tasks: 136 total, 1 running, 135 sleeping, 0 stopped, 0 zombie
对应的信息:tasks表示任务(进程),136则表示现在有136个进程,其中处于运行中的有1个,135个在休眠(挂起),stopped状态即停止的进程数为0,zombie状态即僵尸的进程数为0个。
第三行:CPU状态信息
%Cpu(s): 0.9 us, 0.5 sy, 0.0 ni, 98.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
依次对应:
us——用户空间(user)占用cpu的百分比
sy——内核空间(system)占用cpu的百分比
ni——改变过优先级(niced)的进程占用cpu的百分比
id——空闲(idolt)CPU百分比
wa——IO等待(wait)占用cpu的百分比
hi——IRQ 硬中断(Hardware)占用cpu的百分比
si——软中断(software)占用cpu的百分比
st——被hypervisor偷去的时间
第三行和第四行:当前内存状态信息, 单位都是KiB
KiB Mem : 16267100 total, 1142448 free, 7907452 used, 7217200 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 7969352 avail Mem
显示的信息与命令 free 显示的信息相同
对应信息:
Mem:物理内存总量(16G)
free: 空闲内存总量(1G)
used: 使用中的内存总量
buff/cache: 用作内核缓存的内存量
注:使用中的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心,
buff/cached代表了buff和cache总共用了多少,buff代表buffer cache占了多少空间,由于它主要用来缓存磁盘上文件的元数据,所以一般都比较小,跟cache比可以忽略不计;
cache代表page cache和其它一些占用空间比较小且大小比较固定的cache的总和,基本上cache就约等于page cache,page cache的准确值可以通过查看/proc/meminf中的Cached得到。由于page cache是用来缓存磁盘上文件内容的,所以占有空间很大,Linux一般会尽可能多的将空闲物理内存用于page cache。
Swap: 交换区总量
free:空闲交换区总量
used: 使用的交换区总量
avail Mem:表示可用于进程下一次分配的物理内存数量,这个大小一般比free大一点,因为除了free的空间外,系统还能立即释放出一些空间来。
对于内存监控,在top里我们要时刻监控swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。正常情况下swap应该很少被使用,used值比较大说明交换空间被使用的比较多,如果通过vmstat命令看到swap in/out的比较频繁的话,说明系统内存严重不足,整体性能已经受到严重影响
此处可参考:
Linux系统设置swap大小,创建swap,top虚拟内存,VIRT RES SH_linux设置swap空间_Michaelwubo的博客-CSDN博客
最后为进程信息区
top命令第七行,各进程的监控:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
依次对应:
PID — 进程id
USER — 进程所有者
PR — 进程优先级
NI — nice值。负值表示高优先级,正值表示低优先级
VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR — 共享内存大小,单位kb
S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU — 上次更新到现在的CPU时间占用百分比
%MEM — 进程使用的物理内存百分比
TIME+ — 进程使用的CPU时间总计,单位1/100秒
COMMAND — 进程名称(命令名/命令行)
使用c++的请参考:
linux 进程virt、res内存分析_virt res_爆破小能手的博客-CSDN博客
这里请参考:
理解virt res shr之间的关系 - linux_virt res shr 和 xmx关系_haima1998的博客-CSDN博客
二.交互命令
1.1 ‘h’ 帮助
top命令进入视图后,键入h会显示如下界面,显示交互命令的帮助菜单
1.2 敲ENTER或者 SPACE键: 刷新显示
1.3 A’: 切换交替显示模式
top命令视图下,键入‘A‘显示如下:
显示4个窗口:Def (默认字段组)
Job (任务字段组)
Mem (内存字段组)
Usr (用户字段组)
四组字段共有一个独立的可配置的概括区域和它自己的可配置任务区域。4个窗口中只有一个窗口是当前窗口。当前窗口的名称显示在左上方。(注:只有当前窗口才会接受你键盘交互命令)
我们可以用’a’和’w’在4个 窗口间切换。’a’移到后一个窗口,’w’移到前一个窗口。用’g’命令你可以输入一个数字来选择当前窗口。
在键入‘A‘后在键入‘a‘的显示如下:
1.4 ‘B’: 触发粗体显示
一些重要信息会以加粗字体显示。这个命令可以切换粗体显示
1.5 ‘d’ 或‘s’: 设置显示的刷新间隔
当键下’d’或’s’时,你将被提示输入一个值(以秒为单位),它会以设置的值作为刷新间隔。如果你这里输入了6.0,top将会每秒刷新
1.6 ‘l’、‘t’、‘m’: 切换负载、任务、内存信息的显示
1.7 ‘f’: 字段管理
用于选择你想要显示的字段。用’*’标记的是已选择的。
上下光标键在字段内导航,左光标键可以选择字段,回车或右光标键确认。
按’<’移动已排序的字段到左边,’>’则移动到右边。
1.8 ‘R’: 反向排序
1.9 ‘c’: 触发命令
切换是否显示进程启动时的完整路径和程序名。
键入‘c’后显示:
2.0 ‘i’: 空闲任务
切换显示空闲任务