Linux内存异常问题如何处理

58次阅读
没有评论

共计 2659 个字符,预计需要花费 7 分钟才能阅读完成。

自动写代码机器人,免费开通

这篇文章主要介绍 Linux 内存异常问题如何处理,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

1、查看系统内存的使用情况
从中可以看到系统内存总大小是 31G,已使用 21G,空闲 9G,cache 的 2G,swap 暂未使用

点击 (此处) 折叠或打开

free -g

total       used       free     shared    buffers     cached

Mem: 31         21          9          0          0          2

-/+ buffers/cache: 19         11

Swap: 3          0          3

2、查看系统进程内存占用情况
通过 top 简单 M 按照内存使用情况排序看,系统内存使用最大的也就 245M,总体使用不会超过 19G

点击 (此处) 折叠或打开

top – 17:59:04 up  6:44, 1 user, load average: 0.00, 0.00, 0.00

Tasks: 199 total, 1 running, 197 sleeping, 0 stopped, 1 zombie

Cpu(s): 0.1%us, 0.2%sy, 0.0%ni, 99.6%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st

Mem: 32864556k total, 22515836k used, 10348720k free, 71220k buffers

Swap: 4128760k total, 0k used, 4128760k free, 2101028k cached

 PID USER      PR  NI  VIRT  RES SHR S %CPU %MEM    TIME+ COMMAND

 2892 oracle    20   0  211m  13m 9888 S  0.0  0.0   0:01.16 tnslsnr

 2978 oracle    20   0  211m  13m 9888 S  0.0  0.0   0:01.17 tnslsnr

 1353 root      20   0 53088 9312 6396 S  0.0  0.0   0:00.02 VGAuthService

 1332 root      20   0  164m 7784 4572 S  0.0  0.0   0:12.95 vmtoolsd

 1423 root      20   0  199m 5244 4344 S  0.0  0.0   0:07.58 ManagementAgent

 72153 root      20   0 98.1m 4016 3028 S  0.0  0.0   0:00.24 sshd

 72157 root      20   0  105m 1960 1544 S  0.0  0.0   0:00.14 bash

 1550 root      20   0  245m 1744 1104 S  0.0  0.0   0:00.11 rsyslogd

3、通过脚本进一步查看系统内存使用情况
查看所有 PID 使用的内存最大值以及当前值

点击 (此处) 折叠或打开

for pid in `ls /proc/|grep ^[0-9] do echo $pid;cat /proc/${pid}/status|grep  VmPeak|awk -F : {print $2} |grep -v ^$|^# |sort -nk 1 ; done

 for pid in `ls /proc/|grep  ^[0-9] do echo $pid;cat /proc/${pid}/status|grep  RSS|awk -F : {print $2} |grep -v ^$|^# |sort -nk 1  ; done

4、通过上述的两个内存查看,基本可以排除是由于进程占用了大量的系统内存,那么我们还有什么思路会导致系统内存被大量占用呢?
由于这些服务器是虚拟机,我怀疑是不是由于物理内存的共享导致的内存占用呢? (由于宿主机不在我这,所以这个不好排查)
或者会不会是某个内存占用,未释放导致的系统内存被占用?(经过重启服务器,发现系统内存在启动即被占用 19G)
亦或者是某个系统参数设置导致系统内存被启动就分配占用?(联想到 hugepage 可能会导致此类问题)
5、检查 hugepage 是否开启
# cat /sys/kernel/mm/redhat_transparent_hugepage/enabled (其他非 rhel linux 可使用 cat
/sys/kernel/mm/transparent_hugepage/enabled)
[always] madvise never
发现系统开启了透明大页,通过下面命令进一步确认
# cat /proc/meminfo | grep -i huge
AnonHugePages:  0 kB
HugePages_Total:  9732
HugePages_Free:  9732
HugePages_Rsvd:  0
HugePages_Surp:  0
Hugepagesize:  2048 kB
6、关闭 Hugepage,释放内存
vi /etc/sysctl.conf
#vm.nr_hugepages = 9732  将大页数量的配置注释掉或者删除,然后通过 sysctl - p 使其生效
vi /etc/security/limits.conf
#oracle  soft  memlock  unlimited  ## 用户内存锁限制注释掉
#oracle  hard  memlock  unlimited
重启 OS,检查系统内存是否正常, 大页是否关闭
free -g
cat /sys/kernel/mm/redhat_transparent_hugepage/enabled
cat /proc/meminfo | grep -i huge
7、Hugepage 附录
(1)开启 hugepage 优缺点
  优点:提高 TLB 的命中率、利用 HugePages 不会被 Swap 的特性保证内存不会被交换到 Swap 中
  缺点:占用较大的系统内存,即时不起任何应用的情况下,也会占用固定大小系统内存。
(2)使用开启大页场景
  共享内存设置超过 8G+,并且需要做大数据处理,保障数据尽量在内存中不会被经常 swap
(3)查看系统页大小和系统块大小
 getconf PAGESIZE
  tune2fs -l /dev/sda1 |grep Block size
(4)大页默认大小以及数量设置
  大页的默认大小是 2M,可通过 /etc/sysctl.conf  vm.nr_hugepages = 9732 设置大页的数量,总的大页大小是 9732*2/1024=19G

以上是“Linux 内存异常问题如何处理”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注丸趣 TV 行业资讯频道!

向 AI 问一下细节

丸趣 TV 网 – 提供最优质的资源集合!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-07发表,共计2659字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)