今天早上有一个日志轮换,在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))
编辑或如果这是不是可以修复的东西,有没有办法让阿帕奇自动重新加载x次放弃之前(像pm2节点)?
无法分配共享内存是一种特殊的野兽。 这并不意味着整个系统的内存不足,而是你已经达到了pipe理共享内存分配的限制之一。
两个相关的sysctl是kernel.shmmax
(这是限制,以字节为单位,单个共享内存段可以有多大)和kernel.shmall
(共享内存总量,以字节为单位,可以分配给系统)。 使用grep Shmem /proc/meminfo; cat /proc/sys/kernel/shmall
grep Shmem /proc/meminfo; cat /proc/sys/kernel/shmall
可视化这些数量。
您可以通过比较/proc/meminfo
的Shmem
行和/proc/sys/kernel/shmall
来判断shmall
是否被命中。 如果它们大致相等,那么你已经达到了系统级的共享内存限制,并且需要增加kernel.shmall
(或者停止正在使用共享内存的东西)。 否则,您可能需要将kernel.shmmax
增加到比失败的进程想要使用的更大的东西。