日常运维工作过程中,我们经常会遇到swap空间不足的情况,甚至nagios都把swap监控作为一个基础的系统监控项,足以看出这个性能指标的重要性。


一般是MySQL数据库机器比较容易发生swap空间不足,也有应用服务器高负载的情况下也会产生这现象。


为什么会产生swap使用呢?假设我们的物理内存是32G,swap是4G。如果MySQL本身已经占用了24G物理内存,而同时其他程序或者系统模块又需要8G内存,这时候操作系统就可能把MySQL所拥有的一部分地址空间映射到swap上去。

比如拷贝或压缩一个大文件,或用mysqldump导出一个很大的数据库的时候,文件系统往往会向Linux申请大量的内存作为cache,一不小心就会导致L使用swap。这个情景比较常见,以下是最简单的三个调整方法:

① /proc/sys/vm/swappiness的内容改成0(临时),/etc/sysctl.conf上添加vm.swappiness=0(永久)
这个参数决定了Linux是倾向于使用swap,还是倾向于释放文件系统cache。在内存紧张的情况下,数值越低越倾向于释放文件系统cache。

当然,这个参数只能减少使用swap的概率,并不能避免Linux使用swap。


② 修改MySQL的配置参数innodb_flush_method,开启O_DIRECT模式。

这种情况下,InnoDB的buffer pool会直接绕过文件系统cache来访问磁盘,但是redo log依旧会使用文件系统cache。值得注意的是,Redo log是覆写模式的,即使使用了文件系统的cache,也不会占用太多。


③ 添加MySQL的配置参数memlock
这个参数会强迫mysqld进程的地址空间一直被锁定在物理内存上,对于os来说是非常霸道的一个要求。必须要用root帐号来启动MySQL才能生效。

还有一个比较复杂的方法,指定MySQL使用大页内存(Large Page)。Linux上的大页内存是不会被换出物理内存的,和memlock有异曲同工之妙。


程序运行的一个必要条件就是足够的内存,而内存往往是系统里面比较紧张的一种资源。为了满足更多程序的要求,操作系统虚拟了一部分内存地址,并将之映射到 swap上。对于程序来说,它只知道操作系统给自己分配了内存地址,但并不清楚这些内存地址到底映射到物理内存还是swap。


物理内存和swap在功能上是一样的,只是因为物理存储元件的不同(内存和磁盘),性能上有很大的差别。操作系统会根据程序使用内存的特点进行换入和换出,尽可能地把物理内存留给最需要它的程序。但是这种调度是 按照预先设定的某种规则的,并不能完全符合程序的需要。

更多相关文章

  1. jmap使用以及 linux下查看进程的内存使用情况
  2. Zabbix - LINUX下CPU,硬盘,流量,内存监控
  3. Linux内存管理 - PAGE_OFFSET理解
  4. Linux内存占用分析 进程内存空间
  5. 导出内存(linux中)
  6. 双插槽与单插槽内存模型?
  7. CUDA统一内存工作(具体来说,cudaMallocManaged();)
  8. Linux内存管理 (10)缺页中断处理
  9. 进程实际内存占用: 私有驻留内存数(Private RSS)介绍

随机推荐

  1. PHP安全问题汇总
  2. 详解PHP中被忽略的性能优化利器:生成器
  3. 教你使用PHP实现查找你想要的附近人
  4. 你可能要纠正这5个PHP编码小陋习!
  5. PHP处理时间和时区需注意以下三点!
  6. php+redis实现全页缓存系统
  7. 分享php秒杀功能实现的思路
  8. 分享五个与PHP有关的技术大会!【整理推荐
  9. linux与windows下安装ImageMagick及php i
  10. PHP如何使用Echarts生成数据统计报表