![在没有必要的情况下使用交换](https://linux22.com/image/759017/%E5%9C%A8%E6%B2%A1%E6%9C%89%E5%BF%85%E8%A6%81%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E4%BD%BF%E7%94%A8%E4%BA%A4%E6%8D%A2.png)
我有:vm.swappiness = 1
正如这里建议的那样在有足够可用内存时防止使用交换。(据我所知,0 将完全禁用交换)
在很多情况下,我最终会使用 5GB 的交换空间(总共 16GB),
而我有 9GB 的可用内存(总共 32GB)
(如果计算缓存的 RAM,则只有 1GB 可用)。
当我的应用程序开始变慢时(因为大部分 Swap 来自 MariaDB),我运行:
swapoff -a
swapon -a
并且所有交换内存都移至主 RAM。
最终我拥有 5.6GB 可用 RAM,如果算上缓存则为 4GB。
没有明显的理由设置这么多的 Swap。
我一直在研究这个问题,但找不到在不需要时阻止使用 Swap 的方法。
vm.swappiness = 1
肯定是“永久保存”的,因为它在 sysctl.conf 文件中,并且已经重新启动等。
我不想禁用交换,但我能想到的唯一解决方法是:
- 禁用交换
- 每 1 分钟运行一次 cron 来检查有多少可用 RAM
- 如果可用 RAM 较低,则启用交换
但是,这样做非常危险,我希望操作系统足够智能,可以更好地管理这个问题!
有没有办法仅在绝对需要时才使用交换?
答案1
服务器上是否有很多东西在运行?如果是,也许可以考虑为数据库配备专用机器或虚拟机。
这是物理服务器还是虚拟机/云服务器?有些云提供商根本不希望你使用交换(所以只是把它放在那里以防万一):https://docs.rackspace.com/support/how-to/swap-space-on-cloud-servers/
此页面上有一些关于解决 MySQL 或 MariaDB 交换问题的好讨论 - 也许可以查看最后的 NUMA 部分:https://fromdual.com/do-not-underestimate-performance-impacts-of-swapping-on-numa-database-systems
MariaDB 网站上的问答指出 NUMA 交错设置是一种可能的解决方案: https://mariadb.com/kb/en/swap-usage-wont-decrease/
关于内存和 MariaDB 有很多讨论: https://mariadb.com/kb/en/mariadb-memory-allocation/
这是有关 NUMA 的权威 YouTube 视频 :-D https://youtu.be/KmtzQCSh6xk
如果有帮助,请点赞/接受此答案。谢谢。