实验环节:研究top的几个内存参数,Linux在内存不足时oom killer kill低优先级进程,fork进程,系统假死,swap交换区(虚拟内存)设置

实验一、研究top的几个内存参数

先关闭虚拟内存:swapoff -a, 手动释放buffer/cache:echo 3 > /proc/sys/vm/drop_caches,释放结果如下:free>avail Mem,竟有部分物理内存不可用(暂无法解释),buffer/cache不能完全释放,可行的解释是buffer/cache分为buffer(写IO设备的buffer缓存,内部有未落盘的数据,不能被释放),释放的仅是cache部分(读取过的文件缓存)

再开启虚拟内存:swapon -a,手动释放buffer/cache:echo 3 > /proc/sys/vm/drop_caches

docker启动几个耗内存的应用将free内存吃完,当free不足以分配时,部分内存被分配到swap,并释放足够cache内存用于启动新容器(如需1G内存,则是从cache释放1G用于新容器的应用,而不是free剩余235M+765M从cache释放的)

 

 

实验二、极低内存情况下系统OOM killer杀进程

情景1

设置物理内存256MB,启动,xshell连接上去会感觉很卡,这时物理内存用完并用去部分虚拟内存。swapon -s

当尝试swapoff -a关闭交换区时,会报错不能分配内存,如果关闭交换区就不足支持系统进行运行。这时另一个窗口可看到

情景2

从上可以看出,系统正常运行需要约512M内存。关闭系统,从新设置物理内存512M,这时是可以成功关闭交换区的,并且系统也不会卡,这个时候avail Mem是还有比较大的内存。

由于其它程序的运行,内存使用波动,耗尽了物理内存,这时又没有虚拟内存可用,linux保护机制OOM killer开始kill优先级低的进程如下是kill 了mysqld进行后,释放了物理内存。这就是比较常见的OOM killer导致应用挂掉的原因。

重启mysqld无法启动,内存不够用。

 可以journalctl -f  监控系统日志看到

 

情景3 再把内存调高点600M,避免系统波动自动kill进程。

这时xsehll 执行 docker start mongodb ,一个容器不行启动两个,尝试耗尽内存触发OMM killer。如下虚拟机页面(命令输入状态即可)强制输出Linux触发的OOM killer杀掉了低优先级进程mysqld,但是linux的进程fork机制导致无限执行重启。mysqld -uroot -p 尝试连接无法连接。top查看系统负载可能达到几十。进入fork子进程死循环后,系统可能出现假死现象:

  1. 能 Ping 通访问的服务器。
  2. 系统负载非常的高。
  3. SSH 不能登陆或者登陆比较慢。
  4. 服务器上提供的服务都不能正常响应,比如:不能访问系统上部署的 Web 服务器所提供的页面。
  5. 在系统上做任何其它操作都没有反应或者反应较慢

 

这就是我们测试环境低可以内存每天mysqldump(耗内存)时导致一些进程被kill的原因以及myqldump 进行长时间一直不能结束的原因。而dump数据库会全局锁表,所以这时所有表都只能读不能增删改。

 

结论

1.最好能保证free常驻内存能有1G以上,避免Linux去释放buffer/cache,buffer/cache占用过多必然会降低IO读写速度;

2.另外应设当设置一些swap,既可以看作系统内存不足的发出的信号,也可降低系统内存波动OOM killer kill进程几率,但是swap经常被使用(定期重启虚拟内存)就得考虑扩物理内存了,虚拟内存太慢。

较简单一种swap设置如下:(另一种磁盘分区设置为交换区fdisk /dev/demo1)

  dd if=/dev/zero of=swapadd bs=1024 count=5242880     在当前目录创建block size=1KB,共55242880个block即5G, 名为swapadd的文件,

  mkswap swapadd    文件设为交换区

  chmod   600 swapadd  -R 修改权限否则开启交换区报错,而且不能777

  swapon swapadd  开启

   free -m  检测一下

  swapoff swapadd 停用   

 永久生效在/etc/fstab  追加配置: swap绝对路径  swap swap default 0  0

3.为进一步避免kill关键进程,可以nice适当调整重要进程优先级

nice -n -10 sh restart vehicle-payment.jar (-19-20越低cpu获取率越高),修改运行的程序优先级
renice -n 11 12344进程号 ,top -p 12344查看修改后进程的优先级

 

参考链接

http://m.sohu.com/a/316712876_760387

https://blog.csdn.net/t0nsha/article/details/7284936

https://blog.csdn.net/chenghuikai/article/details/77476830

https://blog.csdn.net/ma_mxr/article/details/87686922?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522161252054316780274127622%252522%25252C%252522scm%252522%25253A%25252220140713.130102334.pc%25255Fall.%252522%25257D&request_id=161252054316780274127622&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-2-87686922.pc_search_result_cache&utm_term=buff%252Fcache+%25E9%259C%2580%25E8%25A6%2581%25E9%2587%258A%25E6%2594%25BE%25E5%2590%2597

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值