无法从共享对象映射段:无法分配内存

无法从共享对象映射段:无法分配内存

今天凌晨进行了一次日志轮换,apache 错误日志中的最后一行是:

 [error] (9)Bad file descriptor: apr_socket_accept: (client socket)    apache2: Syntax error on line 250 of /etc/apache2/apache2.conf: Syntax error on line 1 of /etc/apache2/mods-enabled/alias.load: Cannot load /usr/lib/apache2/modules/mod_alias.so into server: /usr/lib/apache2/modules/mod_alias.so: failed to map segment from shared object: Cannot allocate memory

此后,Apache 无法自动重新加载。大约一个小时后,当我查看此问题时,我只需重新启动 Apache,一切正常。它确实在新日志文件中留下了警告:

[warn] pid file /var/run/apache2.pid overwritten -- Unclean shutdown of previous Apache run?

这是什么意思?我该如何纠正错误?

(Apache/2.2.22(Debian))

编辑 或者如果这不是可以修复的问题,有没有办法让 apache 在放弃之前自动重新加载 x 次(就像带有节点的 pm2 一样)?

答案1

无法分配共享内存是一种特殊的野兽。这并不意味着整个系统内存不足,而是你达到了控制共享内存分配的限制之一。

两个相关的 sysctl 是kernel.shmmax(以字节为单位,单个共享内存段的大小限制)和kernel.shmall(以字节为单位,可分配给系统的共享内存总量)。用于grep Shmem /proc/meminfo; cat /proc/sys/kernel/shmall可视化这些数量。

您可以shmall通过比较 和Shmem行来判断是否已达到。如果它们大致/proc/meminfo相等/proc/sys/kernel/shmall,则说明您已达到系统范围的共享内存限制,需要增加kernel.shmall(或停止正在使用共享内存的某些进程)。否则,您可能需要将 增加到kernel.shmmax比失败进程想要使用的值更大的值。

相关内容