看来 mysqld 分配了太多的内存作为 buff/cache:
free -m
total used free shared buff/cache available
Mem: 990 448 96 36 445 326
Swap: 511 511 0
现在我无法启动 httpd 服务,因为它“分叉失败:无法分配内存”。
我想知道为什么会发生这种情况?为什么 445M buff/cache 不能被回收并用于 httpd?
答案1
“buff/cache”列报告缓冲区和缓存使用的内存总和。
缓冲区无法被回收,因为内核需要它们来运行。
缓存可以回收,如“可用”列所示。但是,如果相关缓存页是脏的,则需要将回收内存的当前内容写入交换。但是您的交换已满,如“交换”行的“可用”列中的 0 所示。
总之,内存分配失败是因为您的交换已满,或者换句话说,因为您的虚拟内存已耗尽。
答案2
1GB 对于运行 MySQL 来说是一个非常小的机器。除了已经讨论过的项目之外,请查看my.cnf
(或 MySQL 的配置文件所在的任何位置)。查找或设置(在[mysqld]
部分中)以下内容:
max_connections = 10
innod_buffer_pool_size = 150M
key_buffer_size = 10M
table_open_cache = 50
降低你的价值观到这些;它可能有助于事情开始。
您使用的是哪个版本的 MySQL(或 MariaDB)?您在同一台机器上还安装了哪些其他应用程序?