Thư mục bài viết
Số lượng người dùng đồng thời mà một máy chủ có thể xử lý không phụ thuộc vào số lõi xử lý mà phụ thuộc vào lượng bộ nhớ mà mỗi tiến trình tiêu thụ.
Tuyên bố này có thể nghe có vẻ khiêu khích, nhưng đó lại là trải nghiệm thực tế và đau đớn nhất trong ngành vận hành và bảo trì.
Tại sao bộ nhớ lại là nút thắt cổ chai chính?
Nhiều người khi nhìn thấy một VPS với CPU 8 nhân và 24GB bộ nhớ thường nghĩ rằng họ có thể dễ dàng chạy hàng trăm tiến trình PHP-FPM.
Tuy nhiên, trên thực tế, mức sử dụng bộ nhớ RSS của một tiến trình PHP duy nhất thường lên tới 200MB.
Đây là kết quả thu được thông qua quá trình thử nghiệm thực tế bằng dòng lệnh:
ps --no-headers -o rss -p $(pgrep php-fpm) | awk '{sum+=$1} END {print sum/NR/1024 " MB"}'
Trong cấu trúc phức tạp và môi trường đa plugin của HestiaCP , đặc biệt là khi không có tối ưu hóa OPcache, 200MB là mức dung lượng thông thường.
Điều này có nghĩa là bộ nhớ, chứ không phải CPU, mới là giới hạn cứng quyết định khả năng xử lý đồng thời tối đa.

Tệp cấu hình được đề xuất (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
Logic tính toán tham số và cơ sở thiết lập
| Thông số cấu hình | Thiết lập giá trị | Cơ sở tính toán và thiết lập cốt lõi |
|---|---|---|
| pm | dynamic | Chế độ động cho phép thêm hoặc xóa các tiến trình một cách linh hoạt dựa trên yêu cầu về đồng thời xử lý, cân bằng giữa tốc độ phản hồi và việc sử dụng bộ nhớ. |
| chiều.max_children | 80 | Tổng bộ nhớ 24GB, không bao gồm nhân hệ thống. MySQL/RedisSau Nginx, còn lại khoảng 16GB dung lượng dành cho PHP.16,384 MB / 200 MB ≈ 81.9Đặt giá trị này thành 80 có thể loại bỏ hoàn toàn lỗi OOM (Out of Memory) khi có nhiều tác vụ đồng thời. |
| pm.start_servers | 16 | Chế độ làm nóng trước khi khởi động được thiết lập gấp đôi số lõi CPU (8 lõi × 2 = 16) để đảm bảo dịch vụ có thể xử lý đồng thời các tác vụ cơ bản ngay lập tức sau khi khởi động lại. |
| pm.min_spare_servers | 8 | Đặt số lõi CPU là 8 lõi để đảm bảo có thể xử lý các yêu cầu mới bất cứ lúc nào trong thời gian lưu lượng truy cập thấp. |
| pm.max_spare_servers | 24 | Hãy đặt giá trị này bằng 3 lần số lõi CPU (8 lõi × 3 = 24) để duy trì một số lượng tiến trình vừa phải sau khi lưu lượng truy cập giảm xuống, nhằm xử lý các biến động nhẹ. |
| chiều.max_requests | 500 | Nếu một tiến trình duy nhất đạt đến dung lượng bộ nhớ cơ sở lớn là 200MB, việc giảm số lượng yêu cầu xuống còn 500 sẽ hủy bỏ và xây dựng lại tiến trình đó, giúp dọn dẹp các lỗi rò rỉ bộ nhớ ngầm nhanh hơn. |
| chiều.process_idle_timeout | 10s | 超出 min_spare_servers Các tiến trình không hoạt động sẽ tự động được giải phóng và trả về bộ nhớ hệ thống sau 10 giây không có yêu cầu nào. |
Các thiết lập hỗ trợ thiết yếu và đề xuất tối ưu hóa
1. Cơ chế chống say rượu theo thời gian
request_terminate_timeout = 60s Đó là điểm mấu chốt.
Nó có thể buộc chấm dứt các tiến trình bị kẹt do tình trạng bế tắc cơ sở dữ liệu hoặc bị chặn bởi API của bên thứ ba.
Trong khi đó, Nginx của fastcgi_read_timeout Thời gian giữ phải ít nhất 60 giây, nếu không khách hàng sẽ nhận được tin nhắn sớm hơn dự kiến. 504 Gateway Timeout.
2. Các chiến lược để khắc phục các nút thắt cổ chai về bộ nhớ
Số lượng tối đa 80 tiến trình đồng thời có nghĩa là trong điều kiện đồng thời cực độ, hệ thống có thể xử lý tối đa 80 yêu cầu HTTP động cùng một lúc.
Nếu muốn cải thiện hơn nữa hiệu năng, trọng tâm nên là giảm mức sử dụng bộ nhớ cho mỗi tiến trình.
- Bật OPcache:Trong
php.iniCấu hình tầm trungopcache.enable=1Vàopcache.memory_consumption=256Việc sử dụng bộ nhớ đệm mã bytecode có thể giảm mức sử dụng bộ nhớ của một tiến trình duy nhất từ 200MB xuống còn 60~100MB. - Kiểm soát hợp lý giới hạn bộ nhớ:将
php.iniở giữamemory_limitGiới hạn ở128M或256MĐể ngăn ngừa các kịch bản bất thường riêng lẻVô hạnNó tiêu tốn rất nhiều bộ nhớ.
Khi mức sử dụng bộ nhớ của một tiến trình giảm xuống còn 100MB...pm.max_children Nó có thể được nâng cấp một cách an toàn lên 150 Ngoài ra, khả năng xử lý đồng thời đã tăng gần gấp đôi.
Các quan điểm có thẩm quyền được trích dẫn
Theo các khuyến nghị trong tài liệu chính thức của Nginx :
"Các ứng dụng FastCGI luôn cần được giám sát bằng các chỉ thị thời gian chờ để ngăn ngừa tình trạng cạn kiệt tài nguyên."
(Nguồn: Tài liệu Nginx)
Sách hướng dẫn chính thức của PHP nêu rõ:
"pm.max_children xác định số lượng tối đa các tiến trình con được tạo ra. Đây là chỉ thị quan trọng nhất."
(Nguồn: Tài liệu PHP-FPM)
Những quan điểm có thẩm quyền này hoàn toàn phù hợp với thực tiễn của chúng tôi, chứng minh rằng logic tối ưu hóa không chỉ dựa trên kinh nghiệm mà còn dựa trên các thực tiễn tốt nhất được tiêu chuẩn hóa.
Kết luận: Quan điểm và những trích dẫn quan trọng của tôi
Trong các kịch bản có độ đồng thời cao, CPU là động cơ, bộ nhớ là bình nhiên liệu, còn PHP-FPM là người điều phối đội xe.
Dù động cơ có mạnh đến đâu, nếu bình xăng không đủ lớn, đoàn xe cũng không thể đi được xa.
Các chuyên gia thực thụ không mù quáng thiết lập các thông số ở mức tối đa, mà thay vào đó tính toán chính xác mức sử dụng bộ nhớ của từng tiến trình để tránh lãng phí và tràn bộ nhớ.
Bản chất của tối ưu hóa là tìm ra sự cân bằng tối ưu với nguồn lực hạn chế.
Đây không chỉ là một công nghệ, mà còn là một triết lý.
Do đó, đừng tin rằng "số lượng lõi xử lý quyết định tất cả". Điều thực sự quyết định giới hạn xử lý đồng thời là khả năng kiểm soát bộ nhớ của bạn.
Hãy hành động và tối ưu hóa VPS của bạn để đạt được tiềm năng tối đa, tận dụng tối đa từng giọt bộ nhớ.
Hy vọng bài viết "VPS 8 nhân 24G hết bộ nhớ? Tinh chỉnh tối ưu nhóm tiến trình PHP-FPM dưới HestiaCP" được chia sẻ trên blog của Chen Weiliang ( https://www.chenweiliang.com/ ) sẽ hữu ích cho bạn.
Bạn có thể thoải mái chia sẻ liên kết bài viết này: https://www.chenweiliang.com/cwl-34509.html
