1.1.swap 说明
操作系统设置swap的目的:
程序运行的一个必要条件就是足够的内存,而内存往往是系统里面比较紧张的一种资源。为了满足更多程序的要求,操作系统虚拟了一部分内存地址,并将之映射到swap上。对于程序来说,它只知道操作系统给自己分配了内存地址,但并不清楚这些内存地址到底映射到物理内存还是swap。物理内存和swap在功能上是一样的,只是因为物理存储元件的不同(内存和磁盘),性能上有很大的差别。操作系统会根据程序使用内存的特点进行换入和换出,尽可能地把物理内存留给最需要它的程序。但是这种调度是按照预先设定的某种规则的,并不能完全符合程序的需要。比如MySQL
1.2.虚拟内存使用策略
改系统内核参数/proc/sys/vm/swappiness。调整系统使用swap分区的倾向性,数值越低越倾向于释放文件系统的cache,不能避免Linux系统使用swap分区。swappiness=0表示最大限度使用物理内存,然后才是swap分区。swappiness=100(0~100)表示积极使用swap分区,并且将内存上的数据及时的映射到swap分区上。
最大化限制虚拟内存的使用,以提高mysql对内存的使用效率。
/etc/sysctl.conf配置示例如下:(/proc/sys/vm/swappiness的内容改成10(临时))
vm.swappiness=10
#echo 0 > /proc/sys/vm/swappiness
所有开源数据库都适应。
1.3.对于mysql
1)mysql在在内存高度紧张的时候,数据在内存中保持锁定并且防止可能被swapping out
mysql配置参数memlock,将mysql锁定在内存重防止被swapping out。这个参数会强迫mysqld进程的地址空间一直被锁定在物理内存上
#vim /etc/my.cnf
[mysqld]
memlock
2)改MySQL参数innodb_flush_method,开启O_DIRECT模式。Innodb的buffer pool会直接绕过文件系统cache来访问磁盘,但是redo log依旧会使用文件系统cache。Redo Log是覆写模式的,即使使用了文件系统的cache也不会占用太多
#vim /etc/my.cnf
[mysqld]
innodb_flush_method=O_DIRECT
3)合理的配置mysql内存
全局的内存消耗:例如:innodb_buffer_pool_size:
会话级别的内存消耗:read_buffer_size, sort_buffer_size, read_rnd_buffer_size, tmp_table_size
1.4.其他开源数据库
建议设置内存使用限制:
如redis:
#vim redis.cnf
maxmemory 162144kb
Mongodb:
#vim mongod.cnf
storage:
dbPath: /opt/mongodb/shard1/
directoryPerDB: true
wiredTiger:
engineConfig:
configString : cache_size=128M
1.5.刷新swap缓存
如出现swap现象,没关找到确切的原理,可以清楚swap 进行观察。
利用swapoff和swapon刷新swap缓存
有时运行大量的进程后swap大量占用,达到30%的话机器会变得很慢
可以用以下两个命令清除刷新swap
#swapoff -a
#swapon -a
swap就还原到初始状态
1.6.操作系统swap分配
1)Linux下可以创建两种类型的交换空间,一种是swap分区,一种是swap文件。前者适合有空闲的分区可以使用,后者适合于没有空的硬盘分区,硬盘的空间都已经分配完毕。
2)交换分区(swap)的合理值一般在内存的2 倍左右,可以适当加大。实际上具体还是以实际应用为准。
在Linux系统,我们可以参照Redhat公司为RHEL推荐的SWAP空间的大小划分原则,在你没有其他特别需求时,可以作为很好的参考依据。
内存小于4GB时,推荐不少于2GB的swap空间;
内存4GB~16GB,推荐不少于4GB的swap空间;
内存16GB~64GB,推荐不少于8GB的swap空间;
内存64GB~256GB,推荐不少于16GB的swap空间。
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/5/html/deployment_guide/ch-swapspace
1.7.监控
日常监控swap的值进行有效的管理。
补充:
有些案例发现系统还有大量剩余空间的情况下,已经使用了swap。这正是NUMA架构导致的。NUMA架构下每个Node都有本地的内存空间,Node间内存使用不均衡,当某个Node的内存不足时,就可能导致swap的产生。