【问题标题】:process manage and memory usage nginx + nodejs + php进程管理和内存使用 nginx + nodejs + php
【发布时间】:2015-09-10 05:45:56
【问题描述】:
nginx
2 site use php  
1 site use nodejs with nginx proxy   
linode (  
1 GB RAM 1 CPU Core 24 GB SSD Storage  
2 TB Transfer  
40 Gbit Network In  
125 Mbit Network Out  
) with centos 6.5  

我在随机获取 502 bad gateway 时遇到了麻烦,仅在 nodejs 站点上,其他都很好。

所以我想可能是因为我的内存使用量或一些硬件限制,所以我在命令下面检查我的内存使用情况,我有问题
1。为什么运行这么多 php-fpm
2.内存空闲只有8个?这就是为什么我的 nodejs 项目总是崩溃的原因?

# free -m

             total       used       free     shared    buffers     cached
Mem:           987        978          8          3          0         11
-/+ buffers/cache:        967         20 
Swap:          255        255          0 

# top -b -n 1 -a

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                           
28337 root      20   0  833m  51m 2972 S  0.0  5.2   0:01.93 node /var/www/n                                                                   
27914 apache    20   0  278m  36m 3460 S  0.0  3.7   0:29.15 php-fpm                                                                           
27963 apache    20   0  278m  36m 3440 S  0.0  3.7   0:28.50 php-fpm                                                                           
27992 apache    20   0  273m  36m 3156 S  0.0  3.7   0:27.14 php-fpm                                                                           
27920 apache    20   0  279m  35m 3440 S  0.0  3.6   0:28.94 php-fpm                                                                           
27958 apache    20   0  277m  33m 3408 S  9.8  3.4   0:29.20 php-fpm                                                                           
27898 apache    20   0  278m  33m 3204 S  0.0  3.4   0:30.88 php-fpm                                                                           
27976 apache    20   0  274m  32m 3392 S  0.0  3.3   0:26.00 php-fpm                                                                           
28043 apache    20   0  265m  32m 3392 S  0.0  3.2   0:20.91 php-fpm                                                                           
28000 apache    20   0  272m  32m 3440 S  0.0  3.2   0:24.74 php-fpm                                                                           
28035 apache    20   0  265m  31m 3156 S  0.0  3.2   0:20.20 php-fpm                                                                           
27980 apache    20   0  273m  31m 3156 S  0.0  3.2   0:26.64 php-fpm                                                                           
28038 apache    20   0  264m  31m 3460 S  0.0  3.2   0:19.93 php-fpm                                                                           
28021 apache    20   0  267m  30m 3156 S  0.0  3.1   0:19.82 php-fpm                                                                           
28016 apache    20   0  266m  29m 3392 S  0.0  3.0   0:20.18 php-fpm                                                                           
28024 apache    20   0  265m  29m 3440 S  0.0  3.0   0:19.73 php-fpm                                                                           
25427 root      20   0  884m  29m  620 S  0.0  3.0   1:31.45 PM2 v0.14.7: Go                                                                   
28054 apache    20   0  260m  27m 3344 S  0.0  2.8   0:17.47 php-fpm                                                                           
28012 apache    20   0  264m  27m 3392 S  0.0  2.8   0:20.82 php-fpm                                                                           
28058 apache    20   0  258m  26m 3460 S 13.7  2.7   0:16.46 php-fpm                                                                           
28094 apache    20   0  258m  25m 3204 S  0.0  2.6   0:15.12 php-fpm                                                                           
28241 apache    20   0  255m  24m 3440 S  0.0  2.5   0:13.54 php-fpm                                                                           
28091 apache    20   0  255m  24m 3440 S  0.0  2.5   0:13.13 php-fpm                                                                           
28254 apache    20   0  254m  24m 3204 S  0.0  2.5   0:12.11 php-fpm                                                                           
 2637 root      20   0  420m  23m 1712 S  0.0  2.4  12:03.18 fail2ban-server                                                                   
28258 apache    20   0  252m  22m 3224 S  0.0  2.3   0:11.64 php-fpm                                                                           
28268 apache    20   0  252m  22m 3204 S  0.0  2.3   0:10.10 php-fpm                                                                           
28293 apache    20   0  249m  21m 3588 S  9.8  2.1   0:08.04 php-fpm                                                                           
28274 apache    20   0  248m  19m 3204 S  0.0  2.0   0:09.04 php-fpm                                                                           
28288 apache    20   0  248m  18m 3204 S  0.0  1.9   0:07.52 php-fpm                                                                           
28312 apache    20   0  244m  17m 3628 S  0.0  1.7   0:04.71 php-fpm                                                                           
28298 apache    20   0  245m  16m 3156 S  0.0  1.7   0:05.48 php-fpm                                                                           
28319 apache    20   0  242m  14m 3388 S  0.0  1.4   0:03.05 php-fpm                                                                           
28333 apache    20   0  241m  13m 3440 S  0.0  1.4   0:01.73 php-fpm                                                                           
28344 apache    20   0  239m  12m 3828 S  0.0  1.2   0:00.47 php-fpm                                                                           
28355 root      20   0 98696 5808 4896 S  0.0  0.6   0:00.00 sshd                                                                              
28342 postgres  20   0  318m 3628 2120 S  0.0  0.4   0:00.02 postmaster                                                                        
28356 sshd      20   0 67628 3140 2408 S  0.0  0.3   0:00.00 sshd                                                                              
28368 root      20   0 15080 2000 1704 R  0.0  0.2   0:00.00 top                                                                               
26870 nginx     20   0 97436 1848  644 S  2.0  0.2   1:04.77 nginx    

ps 辅助 --sort -rss |头

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
apache   28298  0.9  4.1 286860 41600 ?        S    04:46   0:32 php-fpm: pool www            
root     28649  3.9  4.0 712164 41360 ?        Ssl  05:43   0:01 node /var/www/html/nodejssite.com/app/app.js                           
apache   28293  0.9  3.9 287736 40072 ?        S    04:44   0:33 php-fpm: pool www            
apache   28319  0.9  3.8 283160 38668 ?        S    04:51   0:28 php-fpm: pool www            
apache   28344  0.9  3.6 282864 36704 ?        S    04:56   0:27 php-fpm: pool www            
apache   28312  1.1  3.5 290280 36108 ?        S    04:49   0:36 php-fpm: pool www            
apache   28274  0.9  3.5 290128 35412 ?        S    04:39   0:35 php-fpm: pool www            
apache   28268  0.8  3.3 289060 34248 ?        S    04:37   0:33 php-fpm: pool www            
apache   28408  0.8  3.2 274004 33004 ?        S    05:03   0:21 php-fpm: pool www  

/etc/nginx/nginx.conf

user              nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log;
#error_log  /var/log/nginx/error.log  notice;
#error_log  /var/log/nginx/error.log  info;

pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    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;

    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;

}

/etc/nginx/conf.d/default.conf

server {
listen 80;
server_name phpsite.com www.phpsite.com;
access_log /var/log/nginx/phpsite.access.log;
root /var/www/html/phpsite;
index index.php index.html index.htm;
try_files $uri $uri/ /index.php?$query_string;
client_max_body_size 1G;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;

fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 32k;
fastcgi_buffers 8 32k;
}
}

server {
listen 80;
server_name sub.phpsite.com www.sub.phpsite.com;
access_log /var/log/nginx/sub.phpsite.access.log;
root /var/www/html/sub;
index index.php index.html index.htm;
try_files $uri $uri/ /index.php?$query_string;
client_max_body_size 1G;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;

fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 32k;
fastcgi_buffers 8 32k;
}
}


server {
listen 80;
server_name nodejssite.com  www.nodejssite.com;
access_log /var/log/nginx/nodejssite.com.access.log;
location ~ ^/sitemap/(.*)$ {
root /var/www/html/nodejssite.com/app/Sitemap/SitemapGz;
}
location /robots.txt {
alias /var/www/html/nodejssite.com/app/robots.txt;
}
location ~ ^/(images/|javascripts/|stylesheets/|fonts) {
root /var/www/html/nodejssite.com/app/assets;
access_log off;
expires max;
}
location / {
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 配置。
  • @Gijs 我添加了问题

标签: php node.js memory-management nginx fastcgi


【解决方案1】:
  1. php-fpm 进程的数量由它的配置文件控制,/etc/php5/fpm/pool.d/www.conf 在 ubuntu 中。

    pm = dynamic
    pm.max_children = 64
    pm.start_servers = 8
    pm.min_spare_servers = 8
    pm.max_spare_servers = 32
    pm.max_requests = 500        
    

我的建议是根据您预期的网站访问者数量设置此值。 例如:

pm.start_servers = 6
pm.min_spare_servers = 6
pm.max_spare_servers = 6

如果服务器上没有很多用户,php-fpm 的最佳策略是pm = ondemand

你可以阅读更多关于这个there

P.S>能否请您发布此命令的结果,以根据您当前的应用程序内存消耗来帮助您:ps aux --sort -rss | head

【讨论】:

  • 我添加了有问题的结果,而我的 phpfpm 配置 pm = dynamic pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 35 pm.max_requests = 500 每个 php 或 nodejs 网站在 1 小时内平均有 50 个访问者,我是否将其配置错误?
  • 一开始 - 你的问题是内存使用:你可以从free -m - 你的内存和交换已满。在系统日志中你可以看到,OOM 杀手杀死了一些进程。所以主要目标是减少内存使用。从ps aux --sort -rss | head我们可以看到,该节点使用35m内存,每个php-fpm使用30m。简单地说,使用 1Gb 内存,您只能运行 30 个进程,而每个进程需要 30Mb 内存。当你设置 max_spare_chilrens - 你对 php-fpm 说 - 没有问题,如果 35 个孩子将在没有请求的情况下运行。
  • 但这是错误的——我们有问题——你应该减少这个值——你没有记忆。你说,你每小时有 50 个访客。每分钟 1 位访客。您可能有 1 台备用服务器来处理此问题。所以,我的建议是将pm.max_spare_servers 设置为 5。
  • 每小时有 50 位访客。在每个站点中,总共 2 个 php 站点 1 个 nodejs 站点是 150 个访问者,还一样吗? pm = dynamic pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 5 pm.max_requests = 500 ,我应该增加 max_children 吗?和spare server to handle this ?你的意思是这台服务器买不起这 3 个站点?我需要分开到 3 吗?
猜你喜欢
  • 2011-10-11
  • 2014-05-23
  • 2015-10-09
  • 1970-01-01
  • 2013-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-26
相关资源
最近更新 更多