这是我的服务器内存的图表
您可以在图中看到,每次我重新启动 mysqld 时,交换都会变为零。但会随着时间的推移而增加。
如果我将 innodb 缓冲池设置为大尺寸,交换上升得更快,如果我降低它,交换上升得更慢。
答案1
您没有提到任何性能问题,只是它正在使用交换。
这是完全正常的。
如果 RAM 中有些东西不常使用,内核就会将它们交换出去,为经常使用的缓存腾出更多空间。
这可以通过 vm.swappiness 内核参数进行调整,但通常情况下,它的工作方式很好,调整它以不使用交换通常会使性能变差,而不是更好。关于具体调整的内容,可以在这个问题中找到很好的解释:https://unix.stackexchange.com/questions/32333/what-does-the-vm-swappiness-parameter-really-control
多少交换量是可以的以及多少交换量表示存在问题取决于很多因素 - 您只能在调整交换量后通过查看一段时间的性能指标才能真正判断。这将取决于底层磁盘的速度、后台进程唤醒的频率、使用该 RAM 进行缓存与将内容保存在 RAM 中相比节省了多少磁盘 IO。所有这些都取决于您的硬件和工作负载。
答案2
完全同意 Grant 的观点,交换利用率并不总是一个性能问题,但是如果数据库正在交换,您将看到性能问题,但这一切都取决于具体情况。下次当您的系统进行交换时,您可以运行此脚本来找出哪个进程正在交换
http://northernmost.org/blog/find-out-what-is-using-your-swap/
再次像 Grant 建议的那样,将 Oracle、RedHat 等数据库的 vm.swappiness 参数降低到 10 以下(默认设置为 60),并且主要由算法使用
swap_tendency=mapped_ratio/2 + distress + vm_swappiness
if swap_tendency < 100 kernel will reclaim a page from page cache
if swap_tendency >=100 Page will be eligible for swap
此外还有一些 mysql 调整器脚本,但请在生产中应用之前在测试环境中对其进行测试http://mysqltuner.com/
此外,MySQL 现在支持不可交换的大页面,随着 TLB 大小的减少和缓存命中率的提高,您将看到性能的提升http://dev.mysql.com/doc/refman/5.0/en/large-page-support.html