it-swarm-vi.tech

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

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 :)

36
lima

Cảm ơn mọi người vì câu trả lời của bạn ! Thực hiệ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 (nhưng tôi sẽ sớm tối ưu hóa nó được cho là một giải pháp giúp tôi thoát khỏi rắc rối nhanh chóng).

Đâ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 đã kết thúc bằng cách sử dụng:

[.___.] StartServers 1 [.__.] .__.]

Đây không phải là con số ma thuật. Tôi đã dành thời gian để thử các giá trị và 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 ở mức bình thường - 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 KeepAlive của Apache. Bằng cách đặt KeepAliveTimeout thà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 đang 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 skip-innodb đến my.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:

  • Xóa PHP mô-đun 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ử tối thiểu của riêng mình PHP trên các VPS khác.
  • Chuyển sang nginx bằng 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.
23
lima

Tôi đã tìm thấy bài viết này về cấu hình bộ nhớ thấp cho Apache và MySQL

Rất hữu ích trong việc đưa ra các thay đổi cấu hình cần thiết cho cấu hình bộ nhớ thấp. Tôi đã điều chỉnh chúng cho tình huống của riêng tôi nhưng họ sẽ cung cấp cho bạn các công cụ cần thiết để tìm ra cách phù hợp nhất với môi trường của bạn

6
Kevin Kuphal

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ý rất nhiều lưu lượng truy cập cao điểm. 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 quy trình Apache đang chạy tại bất kỳ điểm nào - giả sử prefork ở đây, vì tôi chỉ triển khai PHP ứng dụng và PHP không phải là chủ đề an toàn. Tôi không có kinh nghiệm đo kích thước MPM worker. 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 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 là 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 ứng dụng RAM 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 được xử lý theo từng quy trình thấp.

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

4
Karl Katzke

Vì bạn đã đạt được mục tiêu của mình, đâ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 với Apache. Theo mặc định (tùy thuộc vào quá trình 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

2
rasjani

Đố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 PHP mô-đun bạn không cần.

Tiếp theo, bạn nên định cấu hình Apache MaxCl Client 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 xuất sắc MySQL Tune Primer Script.

Nếu bạn có quyền kiểm soát đối với PHP, 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.

2
yhager

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 ...
0
Unknown

Tất nhiên bạn có thể giới hạn số lượng quy trình mà Apache có thể phân 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 nhớ những điều nhỏ nhặt như sử dụng các tệp .htaccess sử dụng nhiều tài nguyên hơn so với sử dụng các tệp cấu hình trung tâm của Apache (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
Coops

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
D.F.