Apa yang salah dalam konfigurasi php-fpm saya?

8

Saya memiliki server 64-bit tetapi hanya 256MB RAM. Jadi, saya pindah ke server nginx dengan fast-cgi untuk terhubung ke PHP. Saya menjalankan PHP 5.3.6.

Masalahnya adalah bahwa setelah setiap dua atau tiga hari ketika saya mencoba mengakses halaman PHP apa pun maka saya mendapatkan kesalahan internal server. Satu-satunya cara adalah memulai kembali php-fpm secara manual. Ini berarti saya harus menetapkan beberapa parameter yang salah yang menyebabkannya tersedak. Di bawah ini saya telah mendaftarkan konfigurasi yang relevan.

/etc/php-fpm.conf: -

include=/etc/php-fpm.d/*.conf
log_level = error
;emergency_restart_threshold = 0
;emergency_restart_interval = 0
;process_control_timeout = 0

/etc/php-fpm.d/www.conf: -

[www]
pm = dynamic
pm.max_children = 10
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 5
pm.max_requests = 500

/etc/nginx/php.conf: -

location ~ \.php {
        fastcgi_param  QUERY_STRING       $query_string;
        fastcgi_param  REQUEST_METHOD     $request_method;
        fastcgi_param  CONTENT_TYPE       $content_type;
        fastcgi_param  CONTENT_LENGTH     $content_length;

        fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
        fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        fastcgi_param  REQUEST_URI        $request_uri;
        fastcgi_param  DOCUMENT_URI       $document_uri;
        fastcgi_param  DOCUMENT_ROOT      $document_root;
        fastcgi_param  SERVER_PROTOCOL    $server_protocol;

        fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
        fastcgi_param  SERVER_SOFTWARE    nginx;

        fastcgi_param  REMOTE_ADDR        $remote_addr;
        fastcgi_param  REMOTE_PORT        $remote_port;
        fastcgi_param  SERVER_ADDR        $server_addr;
        fastcgi_param  SERVER_PORT        $server_port;
        fastcgi_param  SERVER_NAME        $server_name;

        fastcgi_pass unix:---some-location---;
}

Perbarui 1

Dan saya memiliki empat proses nginx yang sedang berjalan. Rata-rata setiap proses php-fpm membutuhkan 35MB RAM (ukuran memori Virtual masing-masing 320MB). Saya juga menjalankan proses MySql.

Perbarui 2

Saya lupa menempelkan log.

log kesalahan php-fpm: -

WARNING: [pool www] seems busy (you may need to increase start_servers, or min/max_spare_servers), spawning 8 children, there are 1 idle, and 7 total children
WARNING: [pool www] server reached max_children setting (10), consider raising it
NOTICE: Terminating ...

php-fpm www.error log: -

PHP Fatal error:  Allowed memory size of 33554432 bytes exhausted (tried to allocate 122880 bytes) in /home/webadmin/blog.applegrew.com/html/wordpress/wp-content/plugins/jetpack/class.jetpack-signature.php on line 137
PHP Fatal error:  Allowed memory size of 33554432 bytes exhausted (tried to allocate 122880 bytes) in /home/webadmin/blog.applegrew.com/html/wordpress/wp-content/plugins/jetpack/class.jetpack-signature.php on line 137
PHP Fatal error:  Allowed memory size of 33554432 bytes exhausted (tried to allocate 122880 bytes) in /home/webadmin/blog.applegrew.com/html/wordpress/wp-content/plugins/jetpack/class.jetpack-signature.php on line 137
AppleGrew
sumber

Jawaban:

17

Rekomendasi tidak langsung adalah untuk menurunkan nilai yang Anda tetapkan - mungkin memotongnya menjadi dua.

Anda memiliki: pm.max_children = 10 Jika Anda mengatakan 35MB / proses = 350MB; pada kotak 256MB yang berarti banyak bertukar atau Anda kehabisan memori - tidak ada yang baik.

Saya katakan, ambil setidaknya 100MB untuk proses lain, bahkan mungkin 150MB agar aman, dan kemudian bagi angka itu dengan 35MB untuk mendapatkan max_children Anda. Simpan semua nomor lain dalam antrean:

pm = dynamic
pm.max_children = 4
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 2
pm.max_requests = 500

Hentikan PHP-FPM dan jalankan free untuk mendapatkan gambaran tentang memori Anda yang tersedia - bagilah dengan 35MB Anda untuk mendapatkan max_children Anda.

Bergantung pada berapa banyak memori yang dibutuhkan MySQL, Anda mungkin harus menurunkan max_children ke 3.

Saya menemukan bahwa proses PHP-FPM berbagi banyak memori, melakukan percobaan cepat untuk menentukan berapa banyak yang benar-benar digunakan. Hentikan PHP-FPM dan jalankan free. Mulai PHP-FPM, kunjungi beberapa halaman umum (perlu karena memori meningkat tergantung pada halaman yang dimuat), dan periksa total memori yang digunakan, lagi menggunakan free- membagi perbedaan dengan jumlah proses. Ini bukan sistem yang sempurna, tetapi saya menemukan itu cukup akurat (kadang-kadang kolom data di atas tidak buruk juga).

cyberx86
sumber
Saya berhenti, freedan mulai. Saya membagi memori bebas dengan 35 untuk mendapatkan max_children value. Saya tidak mendapatkan tujuan dari para terakhir.
AppleGrew
Tampaknya saya hanya dapat mendukung maksimal 2,3 proses PHP. : P Pokoknya saya sekarang max_childrenke 3.
AppleGrew
a) Tujuan dari 'para terakhir' adalah untuk mendapatkan nilai yang lebih akurat untuk berapa banyak proses PHP yang dikonsumsi. Saya menemukan bahwa nilai dari ps atau atas tidak selalu cocok dengan penurunan dalam memori yang tersedia. Jika menemukan memori yang tersedia, jalankan beberapa proses PHP, dan kemudian ukur kembali memori yang tersedia (alih-alih melihat pada memori yang digunakan oleh proses-proses) Anda bisa mendapatkan nilai 'alternatif' (dan mungkin lebih baik) untuk berapa banyak memori yang digunakan setiap proses. b) Parameter memory_limit yang disarankan oleh invarbrass juga merupakan saran yang bagus. c) Lihatlah skrip mysqltuner.pl, mungkin membantu dengan konfigurasi DB Anda.
cyberx86
@ cyberx86, berapa nilai freeyang Anda perhitungkan? Yang dari baris '- / + buffer / cache' yang digunakan untuk cache disk, tetapi sebenarnya gratis untuk aplikasi?
Roman Newaza
@RomanNewaza - ya, Anda ingin melihat memori yang tersedia untuk aplikasi, jadi Anda akan menggunakan entri untuk 'gratis' di bawah '- / + buffer / cache'.
cyberx86
6

Pengaturan php-fpm Anda tampaknya OK.

Tetapi server yang Anda jalankan agak terbatas sumber dayanya. Jelas dari log bahwa proses PHP melelahkan memori yang tersedia.

Menambah saran yang disediakan oleh cyberx86:

Anda dapat mencoba mengedit parameter memory_limit di file php.ini (lihat di sini ) (walaupun saya tidak yakin itu akan melakukan banyak hal baik)

Mengingat sedikit memori sistem, saya pikir Anda harus mempertimbangkan dengan serius untuk beralih ke OS 32-bit. Menggunakan OS x64 sebenarnya menyakiti Anda daripada menguntungkan.

Jika Anda tidak menggunakan penyimpanan InnoDB dalam database MySql Anda, Anda juga dapat mempertimbangkan mematikan InnoDB di my.cnf Anda - ini akan menghemat 100 MB RAM lainnya.

Lowendbox memiliki tutorial hebat tentang cara mengoptimalkan server untuk konfigurasi memori rendah.

Invarbrass
sumber
Yah suaraku serak mencoba alasan dengan perusahaan hosting saya untuk menyediakan OS 32-bit kepada saya. Tampaknya di seluruh internet perusahaan-perusahaan ini hanya menyediakan 64-bit. Saya hanya menemukan satu perusahaan yang menyediakan OS 32-bit tetapi mereka jauh lebih mahal.
AppleGrew
3

Perintah yang sangat berguna untuk menemukan memori yang diambil oleh php:

ps --no-headers -o "rss,cmd" -C php5-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'

Kemudian Anda membagi RAM yang ingin Anda dedikasikan untuk php, dan Anda memiliki nilai max_children Anda!

Selain itu, Anda dapat memonitor secara manual (Anda harus mengatur status-akhir php) atau dengan Nagios.

Thomas Decaux
sumber
awk: fatal: division by zero attempted
samayo
1
Berarti Anda tidak memiliki proses php5-fpm .... Anda perlu mengubah nama proses "php5-fpm" agar sesuai dengan keinginan Anda.
Thomas Decaux
Saya menggunakan perintah ini. ps --no-headers -o "rss,cmd" | grep php5-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'-C Pilihan tidak bekerja.
mati
Cobalah untuk menjalankan perintah secara terpisah (maksudku ps --tidak-header -o "rss, cmd" pertama dll ...) ini harus mudah untuk debug
Thomas Decaux