VPS 8-teras 24GB kehabisan memori? Panduan praktikal untuk penalaan kolam proses PHP-FPM yang ekstrem dengan HestiaCP

Bilangan pengguna serentak yang boleh dikendalikan oleh pelayan bergantung bukan pada berapa banyak teras yang dimilikinya, tetapi pada berapa banyak memori yang digunakan oleh setiap proses.

Kenyataan ini mungkin kedengaran seperti provokasi, tetapi ia adalah pengalaman paling nyata dan menyakitkan dalam industri operasi dan penyelenggaraan.

Mengapakah ingatan menjadi penghalang utama?

Ramai orang melihat VPS dengan CPU 8-teras dan memori 24GB dan secara tidak sedar berfikir bahawa mereka boleh menjalankan beratus-ratus proses PHP-FPM dengan mudah.

Walau bagaimanapun, pada hakikatnya, penggunaan memori RSS bagi satu proses PHP selalunya setinggi 200MB.

Ini adalah hasil yang diperoleh melalui ujian sebenar melalui baris arahan:

ps --no-headers -o rss -p $(pgrep php-fpm) | awk '{sum+=$1} END {print sum/NR/1024 " MB"}'

Dalam persekitaran rangka kerja dan berbilang pemalam HestiaCP yang kompleks, terutamanya tanpa pengoptimuman OPcache, 200MB adalah kebiasaan.

Ini bermakna memori, bukan CPU, adalah had keras yang menentukan keserentakan maksimum.

VPS 8-teras 24GB kehabisan memori? Panduan praktikal untuk penalaan kolam proses PHP-FPM yang ekstrem dengan HestiaCP

Fail konfigurasi yang disyorkan (php-fpm.conf)

pm = dynamic
pm.max_children = 80
pm.start_servers = 16
pm.min_spare_servers = 8
pm.max_spare_servers = 24
pm.max_requests = 500
pm.process_idle_timeout = 10s
request_terminate_timeout = 60s

Logik pengiraan parameter dan asas penetapan

Parameter konfigurasiMenetapkan nilaiPengiraan teras dan asas persediaan
pmdynamicMod dinamik membolehkan penambahan atau penghapusan proses secara elastik berdasarkan keperluan keserentakan, pengimbangan kelajuan tindak balas dan penggunaan memori.
pm.max_children80Jumlah memori 24GB tolak kernel sistem dan MySQL/RedisSelepas Nginx, kira-kira 16GB tinggal untuk PHP.16,384 MB / 200 MB ≈ 81.9Menetapkannya kepada 80 boleh menghapuskan sepenuhnya OOM (Kehabisan Ingatan) semasa keserentakan tinggi.
pm.start_servers16Pemanasan awal semasa permulaan ditetapkan kepada dua kali ganda bilangan teras CPU (8 teras × 2 = 16) untuk memastikan perkhidmatan tersebut dapat mengendalikan serentak asas serta-merta selepas dimulakan semula.
pm.min_spare_servers8Tetapkan kiraan teras CPU kepada 8 teras untuk memastikan permintaan baharu boleh dibalas pada bila-bila masa semasa tempoh trafik rendah.
pm.max_spare_servers24Tetapkannya kepada 3 kali ganda bilangan teras CPU (8 teras × 3 = 24) untuk mengekalkan bilangan proses yang sederhana selepas trafik surut, bagi mengendalikan turun naik yang perlahan.
pm.max_requests500Jika satu proses mencapai saiz asas yang besar iaitu 200MB, mengurangkan bilangan permintaan kepada 500 sebelum memusnahkan dan membina semula boleh membersihkan kebocoran memori tersirat dengan lebih cepat.
pm.process_idle_timeout10sMelebihi min_spare_servers Proses terbiar dilepaskan secara automatik dan dikembalikan ke memori sistem selepas 10 saat tiada permintaan.

Tetapan Sokongan Penting dan Cadangan Pengoptimuman

1. Mekanisme anti-mabuk tamat masa

request_terminate_timeout = 60s Itulah kuncinya.

Ia boleh menamatkan proses yang tersekat akibat kebuntuan pangkalan data atau penyekatan API pihak ketiga secara paksa.

Sementara itu, Nginx fastcgi_read_timeout Ia mesti disimpan sekurang-kurangnya 60 saat, jika tidak, pelanggan akan menerimanya lebih awal. 504 Gateway Timeout.

2. Strategi untuk mengatasi kesesakan ingatan

Maksimum 80 proses serentak bermakna di bawah keadaan serentak yang ekstrem, sistem boleh mengendalikan maksimum 80 permintaan HTTP dinamik secara serentak.

Jika anda ingin meningkatkan lagi kapasiti, tumpuan harus diberikan kepada pengurangan penggunaan memori setiap proses.

  • Dayakan OPcache: Dalam php.ini Konfigurasi sederhana opcache.enable=1 Dan opcache.memory_consumption=256Caching bytecode boleh mengurangkan penggunaan memori bagi satu proses daripada 200MB kepada 60~100MB.
  • Kawalan had_memori yang munasabah:Will php.ini tengah memory_limit Terhad kepada 128M 或 256MUntuk mengelakkan skrip abnormal individutidak terhadIa menggunakan banyak memori.

Sebaik sahaja penggunaan memori bagi satu proses menurun kepada 100MB...pm.max_children Ia boleh dinaik taraf dengan selamat kepada 150 Di samping itu, keupayaan serentak telah meningkat hampir dua kali ganda.

Pandangan berwibawa dipetik

Menurut cadangan dalam dokumentasi rasmi Nginx :

"Aplikasi FastCGI harus sentiasa dipantau dengan arahan tamat masa untuk mengelakkan kehabisan sumber."
(Sumber: Dokumen Nginx)

Manual PHP rasmi dengan jelas menyatakan:

"pm.max_children mentakrifkan bilangan maksimum proses anak yang akan dicipta. Ini adalah arahan yang paling penting."
(Sumber: Dokumentasi PHP-FPM)

Pandangan berwibawa ini selaras dengan amalan kami, membuktikan bahawa logik pengoptimuman bukan sahaja berdasarkan pengalaman, tetapi juga amalan terbaik yang piawai.

Kesimpulan: Pandangan dan Petikan Utama Saya

Dalam senario serentak tinggi, CPU ialah enjin, memori ialah tangki bahan api dan PHP-FPM ialah penghantar armada.

Tidak kira betapa berkuasanya enjin itu, jika tangki bahan api tidak cukup besar, konvoi itu tidak akan pergi jauh.

Pakar sejati tidak memaksimumkan parameter secara membuta tuli, tetapi sebaliknya mengira penggunaan memori setiap proses dengan tepat untuk mengelakkan pembaziran dan limpahan.

Intipati pengoptimuman adalah untuk mencari keseimbangan optimum dengan sumber yang terhad.

Ini bukan sekadar teknologi, tetapi juga falsafah.

Oleh itu, berhentilah mempercayai bahawa "bilangan teras menentukan segala-galanya." Apa yang benar-benar menentukan had serentak ialah kawalan anda ke atas memori.

Ambil tindakan dan optimumkan VPS anda sepenuhnya, manfaatkan setiap titisan memori sebaik mungkin.

发表 评论

您的邮箱地址不会被公开。必填项已用*标注

Tatal ke