Có gì sai trong cấu hình php-fpm của tôi?


8

Tôi có máy chủ 64 bit nhưng chỉ có 256 MB RAM. Vì vậy, tôi đã chuyển sang máy chủ nginx với fast-cgi để kết nối với PHP. Tôi có PHP 5.3.6 đang chạy.

Vấn đề là cứ sau hai hoặc ba ngày khi tôi cố gắng truy cập bất kỳ trang PHP nào thì tôi lại gặp lỗi nội bộ của máy chủ. Cách duy nhất là khởi động lại php-fpm bằng tay. Điều này có nghĩa là tôi nên đặt một số tham số sai khiến nó bị sặc. Dưới đây tôi đã liệt kê các cấu hình có liên quan.

/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---;
}

Cập nhật 1

Và tôi có bốn quá trình nginx đang chạy. Trung bình mỗi quy trình php-fpm cần 35 MB RAM (mỗi bộ nhớ ảo có kích thước 320 MB). Tôi cũng có một quá trình MySql đang chạy.

Cập nhật 2

Tôi quên dán nhật ký.

Nhật ký lỗi 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 ...

Nhật ký php-fpm www.error: -

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

Câu trả lời:


17

Một đề xuất ngoài lề sẽ là hạ thấp các giá trị đã đặt của bạn - có thể cắt chúng xuống một nửa.

Bạn có: pm.max_children = 10 Nếu bạn nói 35MB / process = 350MB; trên hộp 256 MB có nghĩa là nhiều lần hoán đổi hoặc bạn hết bộ nhớ - không tốt.

Tôi muốn nói rằng hãy lấy ít nhất 100 MB cho các quy trình khác, thậm chí là 150 MB để an toàn và sau đó chia số đó cho 35 MB để lấy max_children của bạn. Giữ tất cả các số khác trong dòng:

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

Dừng PHP-FPM và chạy free để có ý tưởng về bộ nhớ khả dụng của bạn - chia cho 35MB của bạn để lấy max_children của bạn.

Tùy thuộc vào bộ nhớ mà MySQL chiếm bao nhiêu, bạn có thể phải giảm max_children xuống còn 3.

Tôi thấy rằng các quy trình PHP-FPM chia sẻ rất nhiều bộ nhớ, thực hiện một thử nghiệm nhanh để xác định mức độ thực sự được sử dụng. Dừng PHP-FPM và chạy free. Bắt đầu PHP-FPM truy cập một vài trang phổ biến (cần thiết vì bộ nhớ tăng tùy thuộc vào các trang được tải) và kiểm tra tổng bộ nhớ được sử dụng, sử dụng lại free- chia sự khác biệt cho số lượng quy trình. Nó không phải là một hệ thống hoàn hảo, nhưng tôi thấy nó khá chính xác (đôi khi cột dữ liệu ở trên cùng cũng không tệ).


Tôi dừng lại, freevà bắt đầu. Tôi chia bộ nhớ trống đó cho 35 để có được max_children value. Tôi đã không nhận được mục đích của para cuối cùng.
AppleGrew

Có vẻ như tôi chỉ có thể hỗ trợ tối đa 2,3 quy trình của PHP. : P Dù sao thì bây giờ tôi đã max_childrenlên 3.
AppleGrew

a) Mục đích của 'đoạn cuối' là để có được giá trị chính xác hơn cho quá trình PHP tiêu thụ bao nhiêu. Tôi thấy rằng giá trị từ ps hoặc top không phải lúc nào cũng khớp với mức giảm trong bộ nhớ khả dụng. Nếu tìm thấy bộ nhớ khả dụng, hãy chạy một vài quy trình PHP và sau đó lấy lại bộ nhớ khả dụng (thay vì nhìn vào bộ nhớ được sử dụng bởi các quy trình), bạn có thể nhận được giá trị 'thay thế' (và có lẽ tốt hơn) cho mỗi bộ nhớ sử dụng. b) Tham số memory_limit được đề xuất bởi invarbrass cũng là một gợi ý tốt. c) Hãy xem tập lệnh mysqltuner.pl, nó có thể giúp với cấu hình DB của bạn.
cyberx86

@ cyberx86, bạn tính đến giá trị freenào? Hàng từ '- / + bộ đệm / bộ đệm' được sử dụng cho bộ đệm đĩa, nhưng thực sự miễn phí cho các ứng dụng?
Roman Newaza

@RomanNewaza - có, bạn muốn xem bộ nhớ có sẵn cho ứng dụng, vì vậy bạn sẽ sử dụng mục nhập 'miễn phí' dưới '- / + bộ đệm / bộ đệm'.
cyberx86

6

Thiết lập php-fpm của bạn có vẻ ổn.

Nhưng máy chủ bạn đang chạy bị hạn chế về tài nguyên. Rõ ràng từ các bản ghi rằng các quy trình PHP đang làm cạn kiệt bộ nhớ khả dụng.

Thêm vào các đề xuất được cung cấp bởi cyberx86:

Bạn có thể thử chỉnh sửa tham số memory_limit trong tệp php.ini (xem tại đây ) (mặc dù tôi không chắc nó sẽ hoạt động tốt)

Với dung lượng bộ nhớ hệ thống nhỏ, tôi nghĩ bạn nên nghiêm túc xem xét chuyển sang HĐH 32 bit. Sử dụng HĐH x64 thực sự gây tổn thương cho bạn hơn là có lợi.

Nếu bạn không sử dụng bộ lưu trữ InnoDB trong cơ sở dữ liệu MySql của mình, bạn cũng có thể xem xét tắt InnoDB trong my.cnf của mình - nó sẽ tiết kiệm thêm 100 MB RAM.

Lowendbox có một hướng dẫn tuyệt vời về cách tối ưu hóa máy chủ cho cấu hình bộ nhớ thấp.


Vâng, giọng nói của tôi đã trở nên khàn khàn khi cố gắng lý luận với công ty lưu trữ của tôi để cung cấp hệ điều hành 32 bit cho tôi. Dường như trên tất cả các mạng, các công ty này chỉ cung cấp 64 bit. Tôi chỉ tìm thấy một công ty cung cấp HĐH 32 bit nhưng chúng tốn kém hơn nhiều.
AppleGrew

3

Một lệnh rất tiện dụng để tìm bộ nhớ được thực hiện bởi php:

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

Sau đó, bạn chia RAM bạn muốn dành cho php và bạn có giá trị max_children của mình!

Ngoài ra, bạn có thể theo dõi thủ công (bạn phải thiết lập trạng thái php điểm cuối) hoặc với Nagios.


awk: fatal: division by zero attempted
samayo

1
Có nghĩa là bạn không có quy trình php5-fpm .... bạn cần thay đổi tên của quy trình "php5-fpm" để phù hợp với chính bạn.
Thomas Decaux

Tôi đã sử dụng lệnh này bằng ps --no-headers -o "rss,cmd" | grep php5-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'cách nào đó tùy chọn -C không hoạt động.
chết vào

Hãy thử chạy lệnh riêng (ý tôi là ps --no-headers -o "rss, cmd" đầu tiên, v.v ...) điều này sẽ dễ dàng gỡ lỗi
Thomas Decaux 14/11/14
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.