nodejs 앱(express)에 nginx 프록시를 사용하는데, 메모리 사용량이 다른 PHP 앱보다 크다는 것을 알았습니다. nodejs를 처음 사용하는 사람입니다. 이러한 구성과 상태가 정상인지 아니면 뭔가 잘못된 것인지 검토하는 데 도움을 주세요.
# ps aux --sort -rss | head
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 3587 0.1 9.3 1122596 191268 ? Ssl Oct10 0:47 node /var/www/html/domain1.com/app/app.js
mongod 2266 0.4 2.6 652476 53572 ? Sl Oct01 65:18 /usr/bin/mongod -f /etc/mongod.conf
root 2380 0.0 1.9 984316 39184 ? Ssl Oct01 8:18 PM2 v0.14.7: God Daemon
nginx 18011 6.2 0.9 253192 18576 ? S 02:56 0:00 php-fpm: pool www
nginx 17492 3.0 0.9 252996 18452 ? S 02:53 0:05 php-fpm: pool www
nginx 17269 3.1 0.9 252984 18428 ? S 02:52 0:07 php-fpm: pool www
nginx 17261 3.1 0.9 252888 18380 ? S 02:51 0:08 php-fpm: pool www
nginx 17201 3.3 0.8 252936 18148 ? S 02:51 0:10 php-fpm: pool www
postgres 3596 0.0 0.5 326276 11844 ? Ss Oct10 0:01 postgres: db_admin db 127.0.0.1(54307) idle
# free -m
total used free shared buffers cached
Mem: 1991 1209 781 8 121 221
-/+ buffers/cache: 866 1124
Swap: 511 48 463
nginx 구성
server {
listen 80;
server_name domain1.com www.domain1.com;
access_log /var/log/nginx/domain1.com.access.log;
location ~ ^/sitemap/(.*)$ {
root /var/www/html/domain1.com/app/Sitemap/SitemapGz;
}
location /robots.txt {
alias /var/www/html/domain1.com/app/robots.txt;
}
location ~ ^/(images/|javascripts/|stylesheets/|fonts) {
root /var/www/html/domain1.com/app/assets;
access_log off;
expires max;
}
location / {
set $fixed_destination $http_destination;
if ( $http_destination ~* ^https(.*)$ )
{
set $fixed_destination http$1;
}
proxy_pass http://127.00.0.1:8002/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Destination $fixed_destination;
client_max_body_size 32M;
client_body_buffer_size 512k;
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}
nginx 구성
user nginx;
worker_processes 2;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 2048;
}
http {
# fastcgi cache ...
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
reset_timedout_connection on;
send_timeout 2;
gzip on;
gzip_comp_level 5;
gzip_min_length 256;
gzip_proxied any;
gzip_vary on;
gzip_types
application/atom+xml
application/javascript
application/json
application/ld+json
application/manifest+json
application/rdf+xml
application/rss+xml
application/schema+json
application/vnd.geo+json
application/vnd.ms-fontobject
application/x-font-ttf
application/x-javascript
application/x-web-app-manifest+json
application/xhtml+xml
application/xml
font/eot
font/opentype
image/bmp
image/svg+xml
image/vnd.microsoft.icon
image/x-icon
text/cache-manifest
text/css
text/javascript
text/plain
text/vcard
text/vnd.rim.location.xloc
text/vtt
text/x-component
text/x-cross-domain-policy
text/xml;
# Load config files from the /etc/nginx/conf.d directory
# The default server is in conf.d/default.conf
include /etc/nginx/conf.d/*.conf;
}
답변1
Node.js는 기본적으로 javascript V8 엔진을 사용하고 엔진은 가비지 수집을 위해 정교한 알고리즘을 사용하므로 사용 가능한 메모리가 충분하다고 판단되면 이를 활용하려고 합니다. 즉, 메모리 사용량이 높다고 반드시 문제가 있다는 뜻은 아닙니다. node.js는 사용 가능한 모든 메모리의 85-90%를 사용할 수 있지만 매우 빠르게 실행되며 아무런 문제도 없습니다. 높은 메모리 사용량은 정상일 수도 있고 문제일 수도 있지만 알 수 있는 방법이 없습니다. 앱이 매우 느리게 실행되면서 충돌이 발생하지 않는 한 걱정할 필요는 없지만 기준선을 설정하기 위해 계속 지켜볼 것입니다.
그런데, 혹시 앱 모니터링을 위해 newrelic을 사용하면 메모리 사용량이 2~4배 증가하는 경향이 있지만 이것이 작동하는 방식이며 아무런 문제가 없습니다. 그러나 SSL과 관련된 메모리 누수가 문서화되어 있으므로 이것이 영향을 미치는지 확인해야 할 수도 있습니다.