今天凌晨进行了一次日志轮换,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
比失败进程想要使用的值更大的值。