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

今天早上有一个日志轮换,在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/meminfoShmem行和/proc/sys/kernel/shmall来判断shmall是否被命中。 如果它们大致相等,那么你已经达到了系统级的共享内存限制,并且需要增加kernel.shmall (或者停止正在使用共享内存的东西)。 否则,您可能需要将kernel.shmmax增加到比失败的进程想要使用的更大的东西。