Linux内存异常问题处理

今天在做几台数据库初始化部署的时候,发现启动数据库由于内存不足导致启动失败。查看系统内存总共是32G,已经使用了21G,其中cached也就2G,最奇怪的是系统中也没有其他进程占用大量内存。经过层层分析,终于解开了系统内存异常占用的原因,具体分析处理过程如下:
1、查看系统内存的使用情况
从中可以看到系统内存总大小是31G,已使用21G,空闲9G,cache的2G,swap暂未使用

点击(此处)折叠或打开

  1. free -g
  2. total used free shared buffers cached
  3. Mem: 31 21 9 0 0 2
  4. -/+ buffers/cache: 19 11
  5. Swap: 3 0 3
2、查看系统进程内存占用情况
通过top简单M按照内存使用情况排序看,系统内存使用最大的也就245M,总体使用不会超过19G

点击(此处)折叠或打开

  1. top - 17:59:04 up 6:44, 1 user, load average: 0.00, 0.00, 0.00
  2. Tasks: 199 total, 1 running, 197 sleeping, 0 stopped, 1 zombie
  3. 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
  4. Mem: 32864556k total, 22515836k used, 10348720k free, 71220k buffers
  5. Swap: 4128760k total, 0k used, 4128760k free, 2101028k cached

  6.    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
  7.   2892 oracle 20 0 211m 13m 9888 S 0.0 0.0 0:01.16 tnslsnr
  8.   2978 oracle 20 0 211m 13m 9888 S 0.0 0.0 0:01.17 tnslsnr
  9.   1353 root 20 0 53088 9312 6396 S 0.0 0.0 0:00.02 VGAuthService
  10.   1332 root 20 0 164m 7784 4572 S 0.0 0.0 0:12.95 vmtoolsd
  11.   1423 root 20 0 199m 5244 4344 S 0.0 0.0 0:07.58 ManagementAgent
  12.  72153 root 20 0 98.1m 4016 3028 S 0.0 0.0 0:00.24 sshd
  13.  72157 root 20 0 105m 1960 1544 S 0.0 0.0 0:00.14 bash
  14.   1550 root 20 0 245m 1744 1104 S 0.0 0.0 0:00.11 rsyslogd
3、通过脚本进一步查看系统内存使用情况
查看所有PID使用的内存最大值以及当前值

点击(此处)折叠或打开

  1. 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


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/27067062/viewspace-2136142/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/27067062/viewspace-2136142/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值