문제의 서버는 데이터를 보고서로 처리하는 데 사용되며 프로세스 대기열을 확인하기 위해 매분 실행되는 3개의 크론 작업이 있으며, 발견된 것이 있으면 대기열이 빌 때까지 계속 실행됩니다. 특히 바쁜 날(지난 3개월 동안 화요일 및 기타 이상한 날)에는 서버가 다운됩니다.
이를 실행하면 ps aux | grep 'httpd' | awk '{print $6/1024 " MB";}'
세 개의 httpd 작업자가 계속해서 선형 방식으로 메모리를 획득하는 것을 볼 수 있습니다. 보고서 수가 많아 프로세스가 종료되지 않고 계속해서 더 많은 메모리를 차지합니다.
이것은 PHP 런타임이며 내부 메모리 사용량을 조사해 보면 전혀 문제가 되지 않는다는 것을 알 수 있습니다. PHP 메모리의 하드 제한은 256MB이며, PHP 계층 내에서는 보고서 처리가 완료되면 메모리가 최소 해제됩니다. 현재 중복 서버에서 PHP 메모리 분석기를 사용하여 이 문제를 일으키는 PHP 계층에 문제가 있는지 확인합니다. 그러나 위에서 언급한 ps aux 명령은 httpd 작업자 스레드의 메모리가 약 270MB에서 시작하여 전체 서버(8GB RAM)가 소진될 때까지 계속 증가한다는 것을 보여줍니다. 따라서 httpd는 PHP 프로세스나 시스템에 재활용하는 대신 PHP 계층이 사용하는 모든 메모리를 차지할 수 있는 것 같습니다. 다음은 이 문제가 발생할 때 발생하는 오류 로그의 일부입니다.
[Tue Dec 04 09:20:34.805175 2018] [mpm_prefork:error] [pid 2751] (12)Cannot allocate memory: AH00159: fork: Unable to fork new process
[Tue Dec 04 09:20:45.142735 2018] [mpm_prefork:error] [pid 2751] (12)Cannot allocate memory: AH00159: fork: Unable to fork new process
mmap() failed: [
mmap() failed: [
mmap() failed: [1122]] CCannot allocate memoryannot allocate memory12] Cannot allocate memory
mmap() failed: [
mmap() failed: [1122]] CCannot allocate memoryannot allocate memory
mmap() failed: [12] Cannot allocate memory[Tue Dec 04 09:20:45.764357 2018] [php7:error] [pid 12198] [client 127.0.0.1:37694] PHP Fatal error:
Out of memory (allocated 2097152) (tried to allocate 65536 bytes) in /var/www/html/vendor/composer/ClassLoader.php on line 440
[Tue Dec 04 09:20:45.764411 2018] [php7:error] [pid 12197] [client 127.0.0.1:37692] PHP Fatal error: Out of memory (allocated 2097152) (tried
to allocate 65536 bytes) in /var/www/html/vendor/composer/ClassLoader.php on line 440
[Tue Dec 04 09:20:45.764358 2018] [php7:error] [pid 12191] [client 127.0.0.1:37690] PHP Fatal error: Out of memory (allocated 2097152) (tried
to allocate 65536 bytes) in /var/www/html/vendor/composer/ClassLoader.php on line 440
mmap() failed: [
mmap() failed: [1122]] CCannot allocate memoryannot allocate memory
mmap() failed: [12] Cannot allocate memory
mmap() failed: [
mmap() failed: [1122]] CCannot allocate memoryannot allocate memory
mmap() failed: [12] Cannot allocate memory[Tue Dec 04 09:20:46.257438 2018] [php7:error] [pid 12191] [client 127.0.0.1:37690] PHP Fatal error:
Out of memory (allocated 2097152) (tried to allocate 73728 bytes) in /var/www/html/vendor/composer/ClassLoader.php on line 440
[Tue Dec 04 09:20:46.257439 2018] [php7:error] [pid 12197] [client 127.0.0.1:37692] PHP Fatal error: Out of memory (allocated 2097152) (tried
to allocate 73728 bytes) in /var/www/html/vendor/composer/ClassLoader.php on line 440
[Tue Dec 04 09:20:46.257481 2018] [php7:error] [pid 12198] [client 127.0.0.1:37694] PHP Fatal error: Out of memory (allocated 2097152) (tried
to allocate 73728 bytes) in /var/www/html/vendor/composer/ClassLoader.php on line 440
[Tue Dec 04 09:20:57.249945 2018] [mpm_prefork:error] [pid 2751] (12)Cannot allocate memory: AH00159: fork: Unable to fork new process
[Tue Dec 04 09:23:08.171314 2018] [mpm_prefork:error] [pid 2751] (12)Cannot allocate memory: AH00159: fork: Unable to fork new process
[Tue Dec 04 09:24:33.415351 2018] [mpm_prefork:error] [pid 2751] (12)Cannot allocate memory: AH00159: fork: Unable to fork new process
[Tue Dec 04 09:26:22.308600 2018] [mpm_prefork:error] [pid 2751] (12)Cannot allocate memory: AH00159: fork: Unable to fork new process
[Tue Dec 04 09:27:55.057324 2018] [mpm_prefork:error] [pid 2751] (12)Cannot allocate memory: AH00159: fork: Unable to fork new process
[Tue Dec 04 09:29:17.174173 2018] [mpm_prefork:error] [pid 2751] (12)Cannot allocate memory: AH00159: fork: Unable to fork new process
[Tue Dec 04 09:30:39.193341 2018] [mpm_prefork:error] [pid 2751] (12)Cannot allocate memory: AH00159: fork: Unable to fork new process
[Tue Dec 04 09:33:16.023329 2018] [mpm_prefork:error] [pid 2751] (12)Cannot allocate memory: AH00159: fork: Unable to fork new process
[Tue Dec 04 09:34:53.208958 2018] [mpm_prefork:error] [pid 2751] (12)Cannot allocate memory: AH00159: fork: Unable to fork new process
[Tue Dec 04 09:35:30.902310 2018] [mpm_prefork:error] [pid 2751] (12)Cannot allocate memory: AH00159: fork: Unable to fork new process
[Tue Dec 04 09:36:05.215192 2018] [mpm_prefork:error] [pid 2751] (12)Cannot allocate memory: AH00159: fork: Unable to fork new process
[Tue Dec 04 09:37:36.511811 2018] [mpm_prefork:error] [pid 2751] (12)Cannot allocate memory: AH00159: fork: Unable to fork new process
[Tue Dec 04 09:42:18.453045 2018] [suexec:notice] [pid 2699] AH01232: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
사용 중인 httpd 모드:
$ sudo httpd -M
Loaded Modules:
core_module (static)
so_module (static)
http_module (static)
access_compat_module (shared)
actions_module (shared)
alias_module (shared)
allowmethods_module (shared)
auth_basic_module (shared)
auth_digest_module (shared)
authn_anon_module (shared)
authn_core_module (shared)
authn_dbd_module (shared)
authn_dbm_module (shared)
authn_file_module (shared)
authn_socache_module (shared)
authz_core_module (shared)
authz_dbd_module (shared)
authz_dbm_module (shared)
authz_groupfile_module (shared)
authz_host_module (shared)
authz_owner_module (shared)
authz_user_module (shared)
autoindex_module (shared)
cache_module (shared)
cache_disk_module (shared)
cache_socache_module (shared)
data_module (shared)
dbd_module (shared)
deflate_module (shared)
dir_module (shared)
dumpio_module (shared)
echo_module (shared)
env_module (shared)
expires_module (shared)
ext_filter_module (shared)
filter_module (shared)
headers_module (shared)
http2_module (shared)
include_module (shared)
info_module (shared)
log_config_module (shared)
logio_module (shared)
macro_module (shared)
mime_magic_module (shared)
mime_module (shared)
negotiation_module (shared)
remoteip_module (shared)
reqtimeout_module (shared)
request_module (shared)
rewrite_module (shared)
setenvif_module (shared)
slotmem_plain_module (shared)
slotmem_shm_module (shared)
socache_dbm_module (shared)
socache_memcache_module (shared)
socache_shmcb_module (shared)
status_module (shared)
substitute_module (shared)
suexec_module (shared)
unixd_module (shared)
userdir_module (shared)
version_module (shared)
vhost_alias_module (shared)
watchdog_module (shared)
dav_module (shared)
dav_fs_module (shared)
dav_lock_module (shared)
lua_module (shared)
mpm_prefork_module (shared)
proxy_module (shared)
lbmethod_bybusyness_module (shared)
lbmethod_byrequests_module (shared)
lbmethod_bytraffic_module (shared)
lbmethod_heartbeat_module (shared)
proxy_ajp_module (shared)
proxy_balancer_module (shared)
proxy_connect_module (shared)
proxy_express_module (shared)
proxy_fcgi_module (shared)
proxy_fdpass_module (shared)
proxy_ftp_module (shared)
proxy_http_module (shared)
proxy_hcheck_module (shared)
proxy_scgi_module (shared)
proxy_uwsgi_module (shared)
proxy_wstunnel_module (shared)
ssl_module (shared)
php7_module (shared)
$ httpd -l
Compiled in modules:
core.c
mod_so.c
http_core.c
httpd/http.d/http.conf
<IfModule mpm_prefork_module>
StartServers 2
MinSpareServers 2
MaxSpareServers 4
MaxRequestWorkers 10
MaxConnectionsPerChild 1
</IfModule>
답변1
...프로세스 대기열을 확인하기 위해 1분마다 3개의 cron 작업이 실행됩니다. 발견된 항목이 있으면 대기열이 빌 때까지 계속 실행됩니다.
이로 인해 쉽게 메모리 누수가 발생할 수 있으므로 bash 악마를 사용하여 대기열의 각 항목에 대한 새 인스턴스를 차례로 생성합니다.
while true ; do
while read -r F ; do
php /var/www/html/my.site.com/process1.php "$F"
done < <(find /path/to/queue -type f)
sleep 1
done
부르다
wget -q -O /dev/null http://localhost/core/processing
불필요하게 Apache를 포함하고 항목 기간보다 오랫동안 메모리를 유지하도록 허용합니다.