![在 32 位操作系统上,一个进程(MySQL)可以消耗的最大内存是多少?](https://linux22.com/image/509881/%E5%9C%A8%2032%20%E4%BD%8D%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E4%B8%8A%EF%BC%8C%E4%B8%80%E4%B8%AA%E8%BF%9B%E7%A8%8B%EF%BC%88MySQL%EF%BC%89%E5%8F%AF%E4%BB%A5%E6%B6%88%E8%80%97%E7%9A%84%E6%9C%80%E5%A4%A7%E5%86%85%E5%AD%98%E6%98%AF%E5%A4%9A%E5%B0%91%EF%BC%9F.png)
我在 32 位 RHEL 机器上运行 MySQL。服务器本身总共有 4GB 内存,其中 2GB 分配给 MySQL。
我想知道我可以放入盒子的最大内存量以及我可以为 MySQL 分配多少内存。
我听说 32 位操作系统上每个进程的限制是 2GB 和 4GB......
最终,我想知道是否可以在不升级到 64 位操作系统的情况下增加 MySQL 的内存。
答案1
这取决于你的内核和配置。通常为 2Gb 或 3Gb。
不过,应用程序本身可能有一个自我设定的下限。即使操作系统允许,某些 32bti 应用程序/服务也不会使用超过 2G 的内存,因为它们自己的内部内存管理对所有事物都使用(或允许)有符号的 32 位整数。
如果您的 CPU、内存控制器、操作系统和应用程序都支持 PAE,那么单个进程就可以使用更多 RAM。Linux 内核支持 PAE,毫无疑问,RHEL 存储库中的预构建内核已启用该功能(由于会影响性能,大多数默认内核均未启用该功能)——但我不知道 MySQL 是否支持该功能。
如果您使用的是较旧的内核,则可能需要研究内存映射配置 - 虽然大多数新内核默认在每个进程中的内核和用户空间映射地址空间之间进行 1G/3G 分割,但在较早的时候(当机器的 RAM 接近 32 位地址空间的限制时实际上是闻所未闻的)2G/2G 分割是默认设置,但如果您需要 1G/3G,则可以进行更改。
无需深入研究该主题,我的猜测是(除非您使用的是较旧的内核,并且这是施加 2G 限制而不是 3G 限制的原因)MySQL 如果不升级到 64 位编译,则不会使用超过 2G 的内存。不过,额外的 RAM 不太可能被浪费 - 内核将使用它作为缓存/缓冲区,因此虽然 MySQL 直接使用它效率会更高(因为 MySQL 的缓存和 OS 缓存都保存相同数据块的情况会少得多),但它不会闲置,因此将看到一些好处。
答案2
大多数现代发行版和处理器都支持 PAE,这是英特尔的指令集,允许超出 32 位限制的内存寻址。PAE 允许处理器访问最多 64GB 的 RAM。PAE 有额外的 CPU 开销。
即使使用 PAE,32 位 Linux 的每个进程的寻址限制也为 3GB。通常,内核会保留大约 1GB。
MySQL 是单进程守护进程。因此,即使使用 PAE,它也无法处理 32 位限制之外的问题。
一些有用的参考资料:
答案3
我认为每个进程都可以看到(地址) 4 GB,但其中 2 GB 是内核空间,不能被应用程序数据填充。
因此,我假设 MySQL 可能会使用 MySQL 实例数乘以 2 GB 的总内存(物理内存和交换空间)。