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

Joh*_*ohn 1 apache-2.2

今天早上有一次日志轮换,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
Run Code Online (Sandbox Code Playgroud)

此后 Apache 无法自动重新加载。大约一个小时后,当我开始查看这个问题时,我只是重新启动了 apache,一切都很好。它确实在新日志文件中留下了警告:

[warn] pid file /var/run/apache2.pid overwritten -- Unclean shutdown of previous Apache run?
Run Code Online (Sandbox Code Playgroud)

这是什么意思?我该如何纠正出现的问题?

(Apache/2.2.22 (Debian))

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

wom*_*ble 5

无法分配共享内存是一种特殊的问题。这并不意味着整个系统内存不足,而是意味着您已经达到了管理共享内存分配的限制之一。

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

通过比较与 的线可以判断是否shmall被击中。如果它们大约相等,那么您已经达到了系统范围的共享内存限制,并且需要增加(或停止正在使用共享内存的某些内容)。否则,您可能需要增加到比失败的进程想要使用的更大的值。Shmem/proc/meminfo/proc/sys/kernel/shmallkernel.shmallkernel.shmmax