Nginx dan PHP-FPM kehabisan koneksi

9

Saya terus mengalami kesalahan seperti ini,

[02-Jun-2012 01:52:04] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 19 idle, and 49 total children
[02-Jun-2012 01:52:05] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 16 children, there are 19 idle, and 50 total children
[02-Jun-2012 01:52:06] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 19 idle, and 51 total children
[02-Jun-2012 03:10:51] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 18 idle, and 91 total children

Saya mengubah pengaturan untuk php-fpm ke ini,

pm.max_children = 150 (It was at 100, i got a max_children reached and upped to 150)
pm.start_servers = 75
pm.min_spare_servers = 20
pm.max_spare_servers = 150

Yang menghasilkan

[02-Jun-2012 01:39:19] WARNING: [pool www] server reached pm.max_children setting (150), consider raising it

Saya baru saja meluncurkan situs web baru yang mendapatkan jumlah lalu lintas yang cukup besar. Lalu lintas ini sah dan pengguna mendapatkan 504 batas waktu gerbang ketika batas tercapai.

Saya memiliki koneksi terbatas ke server saya dengan IPTABLES dan saya menjalankan fail2ban dan melacak log akses nginx. Lalu lintas semuanya sah, saya hanya kehabisan ruang untuk pengguna.

Saya saat ini berjalan pada kotak dual core dengan ubuntu 64bit.

free
             total       used       free     shared    buffers     cached
Mem:       6114284    5726984     387300          0     141612    4985384
-/+ buffers/cache:     599988    5514296
Swap:       524284       5804     518480

Php.ini saya max_input_time = 60

Konfigurasi nginx saya adalah

worker_processes 4;
pid /var/run/nginx.pid;

events {
    worker_connections 19000;
    # multi_accept on;
}
worker_rlimit_nofile    20000;  #each connection needs a filehandle (or 2 if you are proxying)

client_max_body_size 30M;
client_body_timeout   10;
client_header_timeout 10;
keepalive_timeout     5 5;
send_timeout          10;

    location ~ \.php$ {
    try_files $uri /er/error.php;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_connect_timeout 60;
    fastcgi_send_timeout 180;
    fastcgi_read_timeout 180;
    fastcgi_buffer_size 128k;
    fastcgi_buffers 256 16k;
    fastcgi_busy_buffers_size 256k;
    fastcgi_temp_file_write_size 256k;
    fastcgi_max_temp_file_size 0;
    fastcgi_intercept_errors on;
    fastcgi_pass unix:/tmp/php5-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
}

Apa yang bisa saya lakukan untuk berhenti kehabisan koneksi? Mengapa ini terus terjadi? Saya memantau lalu lintas saya di Google Analytics secara realtime dan ketika jumlah pengguna di atas sekitar 120 php-fpm.log saya penuh dengan peringatan ini ..

E3pO
sumber

Jawaban:

5

Sudahkah Anda mempertimbangkan untuk mengikuti saran bagus yang disediakan dalam pesan log, meningkatkan nilai pm.max_children? Anda punya banyak RAM untuk menampungnya.

Untuk menjawab pertanyaan Anda:

  • Apa yang bisa saya lakukan untuk berhenti kehabisan koneksi? Berikan lebih banyak koneksi, atau kurangi jumlah koneksi yang Anda terima.
  • Mengapa ini terus terjadi? Karena Anda terus kehabisan koneksi.
womble
sumber
Maaf, kesalahan itu dicatat waktu setelah saya memperbarui ke 150 dari 100 .... Ya saya punya. Pengaturan apa yang harus saya atur untuk semua ram saya?
E3pO
Anda harus menaikkannya ke (free/mem_per_worker)+150, di mana freejumlah memori yang akan Anda miliki setelah memperhitungkan kebutuhan proses lain yang persyaratan memorinya akan meningkat dengan lebih banyak beban, dan mem_per_workeradalah jumlah maksimum memori yang Anda ramalkan setiap proses yang dibutuhkan oleh pekerja PHP.
womble
4

Kami memiliki masalah yang sama pada server web kami.

Anda dapat mencoba untuk respawn proses anak setiap permintaan X, untuk menghindari kebocoran memori. Ini bekerja dengan baik di Apache dan FPM mulai bekerja dengan baik.

 pm.max_requests = 50000

Ini akan memulai kembali proses anak setiap permintaan 50rb

Ali Alwash
sumber