Cách giảm sử dụng bộ nhớ trên máy chủ web Unix


36

Tôi hiện đang sử dụng Bộ gia tốc Joyent để lưu trữ các ứng dụng web của mình và nó hoạt động tốt, tuy nhiên tôi cần giảm chi phí vì vậy tôi đang hạ cấp gói hiện tại của mình và áp đặt một số giới hạn bộ nhớ mới (256M rss, trao đổi 512M). Tôi đã không đi quá xa so với họ ngày hôm qua, nhưng sau khi khởi động lại Apache vài lần vào hôm nay, giờ tôi là 411M rss, trao đổi 721M (prstat -Z -s cpu).

Tìm kiếm trong Server Fault chỉ cung cấp cho tôi rất nhiều cách và công cụ cụ thể để giám sát máy chủ, nhưng không có lời khuyên nào về cách giảm / tối ưu hóa việc sử dụng bộ nhớ. Tôi cũng đã thấy câu hỏi này , nhưng tôi không nghĩ nó tốt cho tình huống cụ thể này (hoặc tôi có thể nói chung chung?).

Máy chủ đang chạy Solaris trên CPU dùng chung và tôi đang sử dụng ngăn xếp Apache + MySQL + PHP.

Tôi muốn biết các bước người ta có thể thực hiện để khắc phục sự cố này và giải quyết các vấn đề. Tuy nhiên, tôi cũng sắp hết thời gian để giảm dấu chân bộ nhớ và hạ cấp kế hoạch trước khi kết thúc hiện tại, vì vậy bất cứ điều gì có thể tạo ra phép thuật và tiết kiệm trong ngày cũng được chào đón :)


1
Tôi chỉ muốn nhận xét rằng mặc dù tôi đã tự tìm hiểu về các cài đặt này từ googling, nhưng hóa ra tôi đang thay đổi cài đặt trong một tệp, nhưng một tệp cấu hình khác được tải sau đó thực sự đã âm thầm ghi đè cài đặt của tôi! Khi tôi phát hiện ra điều đó, cài đặt các cài đặt MPM prefork và một vài thứ khác có hiệu quả tuyệt vời để giữ cho số lượng quá trình và mức sử dụng bộ nhớ trong tầm kiểm soát, hoán đổi ở mức tối thiểu. Hy vọng thông tin này sẽ giúp những người khác, đặc biệt là những người chạy Gentoo trên máy chủ của họ.
Pistos

Câu trả lời:


23

Cảm ơn tất cả mọi người cho câu trả lời của bạn! Theo đề xuất của bạn, tôi đã có thể giảm mức sử dụng bộ nhớ của mình xuống 195M SWAP và 108M RSS, mà không cần chạm vào mã của tôi (tôi chắc chắn sẽ tối ưu hóa nó sớm, nhưng đây được coi là một giải pháp giúp tôi nhanh chóng thoát khỏi rắc rối).

Đây là danh sách những việc tôi đã làm:

Loại bỏ ký tự đại diện được sử dụng trong các mục Virtualhost. Thay vì *: 80 và *: 443, tôi đã sử dụng IP thực của máy chủ của mình.

Đã thay đổi MPM prefork của Apache. Đây là những giá trị tôi đã sử dụng:

Máy chủ khởi động 1
Máy chủ tối thiểu 1 
Máy chủ tối đa 5 
Máy chủ 16
Tối đa 16
MaxRequestsPerChild 0
NgheBacklog 100

Đây không phải là con số ma thuật. Tôi đã dành một chút thời gian để thử các giá trị và sự kết hợp khác nhau, sau đó thử nghiệm chúng với việc sử dụng thực sự của máy chủ của tôi và mọi người nên làm như vậy trong môi trường của họ. Đối với bản ghi, máy chủ của tôi nhận được gần 2 triệu pv / tháng, phục vụ cả trang động và tài sản ở tốc độ thường xuyên - không có hiệu ứng đào. Mục đích, một lần nữa, là để giảm dung lượng bộ nhớ, không phải để cải thiện hiệu suất hoặc HA.

Tài liệu tham khảo:

Điều chỉnh xuống KeepAlive của Apache. Bằng cách đặt KeepAliveTimeoutthành giá trị thấp hơn (2 trong trường hợp của tôi), tôi có thể mong đợi các quy trình máy chủ ít hơn chỉ chờ kết nối với các máy khách nhàn rỗi có thể không yêu cầu thêm bất kỳ nội dung nào.

Tham khảo: http://httpd.apache.org/docs/2.0/mod/core.html#keepalivetimeout

Đã xóa mô-đun không sử dụng của MySQL. Tôi đã thêm vào skip-innodbmy.cnf của MySQL. Giảm tiêu thụ bộ nhớ lớn.


Ngoài ra còn có một số gợi ý tốt đáng chú ý mà cá nhân tôi không thể làm:

  • Loại bỏ các mô-đun PHP mà bạn không cần. PHP trên máy chủ của tôi có hầu hết các mod đã được biên dịch, có lẽ tôi sẽ thử PHP tối thiểu của riêng tôi trên các VPS khác.
  • Chuyển sang nginx với php-fastcgi. Đó là một lời khuyên tốt khác mà tôi sẽ sớm thử, nhưng ngay bây giờ tôi không thể mạo hiểm thời gian chết.

Tôi đang chạy nginx và php-fastcgi (LEMP) và đang gặp vấn đề về bộ nhớ tương tự ... trên máy chủ 256 MB Tôi thấy rằng php-fastcgi hoạt động tốt với PHP_FCGI_CHILDREN = 5 và PHP_FCGI_MAX_REQUESTS = 333 ... những giá trị này là khởi đầu tốt điểm!
gian xa xôi

Got rid of the wildcard used in VirtualHost entriesĐiều đó thực sự có ích trong bất kỳ cách có ý nghĩa? Tôi đã có ấn tượng rằng sẽ không làm cho một sự khác biệt.
Mahn

@Mahn - nó không giúp ích gì cho Bộ nhớ, nhưng nó cải thiện việc sử dụng CPU, một điều tốt trong môi trường bộ nhớ thấp
jsnfwlr

"Chuyển sang nginx bằng php-fastcgi" --- Một tùy chọn ít hiệu quả hơn nhưng hiệu quả hơn nếu bạn muốn giữ Apache2 sẽ là: Apache2 + mod_proxy_fcgi + mod_mpm_event. mpm_event tương tự nginx. Sử dụng để kết nối với php-fpm. Xem dracony.org/stop-USE-php-fpm-to-argue-USE-nginx-vs-apache
James Johnston


4

Bạn sẽ cần phải giới hạn số lượng quy trình máy chủ apache đang chạy và gần với giới hạn như bạn, bạn sẽ không thể xử lý lưu lượng truy cập cực đại. Có một máy chủ web được sử dụng tối đa trong sử dụng bình thường thường là một ý tưởng tồi (tm), vì hầu hết lưu lượng truy cập web đều tốt và thấp cho đến khi bạn bị chém hoặc đào hoặc bắn đạn lửa hoặc bất cứ điều gì.

Vấn đề chính là số lượng quá trình apache đang chạy tại bất kỳ thời điểm nào - giả sử prefork ở đây, vì tôi chỉ triển khai các ứng dụng PHP và PHP không an toàn. Tôi không có kinh nghiệm đo kích thước MPM công nhân. Có một số mục nằm trong bộ nhớ dùng chung và một số mục nằm trong bộ nhớ của mỗi tiến trình.

Bạn có thể giảm tổng dung lượng bộ nhớ bằng cách loại bỏ các mô-đun được chia sẻ mà bạn không cần. Về cơ bản, Apache được cấu hình từ hầu hết các máy chủ để thực hiện mọi thứ dưới ánh mặt trời. Nếu bạn không sử dụng mod_userdir, thì hãy bình luận nó ra khỏi cấu hình apache của bạn. Chỉ cần cẩn thận bao nhiêu bạn loại bỏ, bởi vì một số điều bạn có thể cần hoặc sự phụ thuộc của họ không trực quan! Tất cả các mô-đun nên được ghi lại trên trang web apache.org. Dấu chân trên mỗi quá trình khó khăn hơn để có được nhỏ hơn; Hầu hết các cấu hình apache ngày nay chỉ đi kèm với bốn mô-đun thiết yếu được biên dịch. Ngoài bốn mô-đun đó, hầu hết việc sử dụng bộ nhớ đến từ rò rỉ hoặc RAM ứng dụng không phải là rác được thu thập hiệu quả, đó là lý do tại sao bạn có thể muốn đặt số lượng yêu cầu xử lý bởi mỗi quá trình thấp.

Bạn thực sự muốn giữ bộ nhớ sử dụng trong RAM và không bị hoán đổi. Hoán đổi có nghĩa là I / O. I / O chậm và sẽ điều khiển việc sử dụng CPU của bạn qua mái nhà dưới dạng khối quy trình trong khi chờ đợi một thứ gì đó được đưa ra khỏi trao đổi.


1
Cảm ơn lời khuyên của Karl! Có cách nào để ngăn chặn máy chủ sử dụng Hoán đổi không? Bởi vì sau khi giảm mức sử dụng bộ nhớ, tôi không dùng RAM nữa, nhưng nó vẫn hiển thị bộ nhớ SWAP đã được sử dụng.
lima

@fandelost Thực sự không có vấn đề gì khi trao đổi đang được sử dụng, đó là khi mọi thứ đang được phân trang vào và ra khỏi trao đổi đó là xấu. Hệ điều hành của bạn có thể hoán đổi các hướng dẫn hoặc dữ liệu từ các quy trình không chạy thường xuyên khi có thời gian để làm như vậy bởi vì nó nghĩ (và thường đúng) rằng các hướng dẫn và dữ liệu đó tốt hơn ở đó.
Patrick James McDougle

2

Đối với apache, hãy xóa các mô-đun bạn không sử dụng, vì chúng chỉ sử dụng bộ nhớ bổ sung. Đối với MySQL, hãy xóa innodb / bbdb nếu bạn không sử dụng chúng và xóa các mô-đun PHP mà bạn không cần.

Tiếp theo, bạn nên định cấu hình Maxache khách hàng dựa trên kích thước của một tiến trình và dung lượng bộ nhớ bạn muốn cung cấp cho apache. Tương tự như vậy đối với các kết nối tối đa trên MySQL (Tôi khuyên bạn nên sử dụng Tập lệnh điều chỉnh MySQL tuyệt vời .

Nếu bạn có quyền kiểm soát ứng dụng PHP của mình, hãy đảm bảo rằng nó không sử dụng quá nhiều bộ nhớ (ví dụ: trong các biến, đặc biệt là các biến tĩnh).

Nếu bạn muốn đi xa hơn, bạn có thể thay thế apache + mod_php bằng thiết lập nginx + fcgi, điều này có thể sẽ dẫn đến việc giảm bộ nhớ hơn nữa.

Một điều cuối cùng - bạn thực sự không muốn trao đổi trên máy chủ web. Chỉ cần một chút, để loại bỏ những thứ không cần thiết, nhưng trao đổi thường xuyên trên máy chủ web sẽ dẫn đến một trang web không phản hồi.


Cảm ơn lời khuyên của bạn, tôi đang thử điều chỉnh-primer.sh nhưng tôi gặp lỗi sau: "lỗi cú pháp ở dòng 94:` cnf_socket = $ 'không mong đợi ". Có ý kiến ​​gì không?
lima

Có thể liên quan đến vỏ. Vì tập lệnh này có thể liên quan đến Linux, hãy thử thay đổi dòng đầu tiên để trỏ đến bash, thay vì / bin / sh. Tôi hy vọng bạn có thể cài đặt bash trên Solaris, nhưng tôi không thể giúp với điều đó ...
yhager

2

Vì bạn đã đạt được mục tiêu của mình, nên đây là một vài bổ sung:

Vì bạn đã loại bỏ tất cả các mô-đun php không cần thiết, bạn có thể giống nhau cho apache. Theo mặc định (tùy thuộc vào cài đặt), apache tải khá nhiều mô-đun bổ sung và hầu hết chúng không thực sự cần thiết cho việc sử dụng hàng ngày. Ví dụ, có một loạt các mô-đun xác thực luôn được tải. thường không yêu cầu giảm phát trừ khi bạn đang cố gắng hạn chế sử dụng băng thông. Autoindex & status đi cũng có vấn đề.

Và một điều nữa là bạn có thể giới hạn số lượng bộ nhớ có sẵn cho php trong php.ini: memory_limit = xxxM


0

Tất nhiên bạn có thể giới hạn số lượng tiến trình apache có thể rẽ nhánh, tuy nhiên điều này chỉ hoạt động như một giới hạn cứng đối với việc sử dụng bộ nhớ của bạn. Từ quan điểm cấp thấp hơn, bạn có thể sử dụng plimit để hạn chế các tài nguyên có sẵn cho một quy trình. Tôi tin rằng áp dụng điều này cho quá trình cha mẹ và con kế thừa.

Tuy nhiên, từ quan điểm cấu hình máy chủ web, nó có thể đi xuống cách mã của bạn chạy thực sự! Nhưng hãy lưu ý những điều nhỏ nhặt như sử dụng tệp .htaccess sử dụng nhiều tài nguyên hơn so với sử dụng tệp cấu hình apache trung tâm (vì chúng được đọc mỗi khi có yêu cầu, dẫn đến chi phí lớn hơn), một điều gì đó có ý nghĩa trong các trang web lớn.


0

Một điều có thể giúp tăng trưởng bộ nhớ theo thời gian là đặt mức giữ httpd thấp hơn, nhưng tôi sẽ kiểm tra cẩn thận trong trường hợp ứng dụng của bạn cần các quy trình tồn tại lâu hơn.


0

Máy chủ đang chạy Solaris trên CPU dùng chung và tôi đang sử dụng ngăn xếp Apache + MySQL + PHP.

Tôi không có kinh nghiệm với Solaris, nhưng điều tốt nhất bạn có thể làm là không sử dụng Apache / mod_php.

  • Chuyển sang nginx với php-fastcgi.
  • Biên dịch lại php để sử dụng số lượng plugin tối thiểu.
  • Loại bỏ các quá trình không cần thiết như ntpd (sử dụng ntpdate), ftp (sử dụng scp), v.v ...
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.