Apache MPM là gì?

Từ phiên bản Apache 2, nó giới thiệu các MPM (Multi-Processing Module) mà Apache sử dụng để hoàn thành những tác vụ liên quan đến chức năng của nó, với MPM nó thay đổi cách ứng sử của Apache: cách nó lắng nghe yêu cầu gửi đến, nhận yêu cầu ra sao, chuyển các yêu cầu đó cho các thành phần khác để xử lý ...

Các MPM cung cấp cho Apache như các module, chọn loại MPM nào để Apache sử dụng thì bạn phải cài đặt MPM đó và cấu hình cho Apache nạp nó như nạp các module khác(nhớ là chỉ nạp được 1 loại MPM).

Kiểm tra xem Apache đang chạy MPM nào?

httpd -V | grep -i 'mpm'

Kết quả là 1 trong các dòng:
Server MPM:     prefork
Server MPM:     event
Server MPM:     worker

Hiện Apache có sẵn 3 lại MPM là: prefork, event, worker cung cấp dưới 3 file module là:

  • /etc/httpd/modules/mod_mpm_prefork.so
  • /etc/httpd/modules/mod_mpm_worker.so
  • /etc/httpd/modules/mod_mpm_event.so

Nếu muốn Apache sử dụng MPM nào thì thiết lập để nó nạp module đó (cấu hình trong /etc/httpd/conf/httpd.conf hay trong /etc/httpd/conf.modules.d/00-mpm.conf), bạn cần xác định Apache của mình load config liên quan đến MPM từ file .conf nào để sửa đổi cho phù hợp

Có thể trong /etc/httpd/conf/httpd.conf có dòng cấu hình IncludeOptional conf.d/*.conf thì nó sẽ nạp thêm các cấu hình bổ xung ở thư mục con conf.d/ và trong đó thường có file ??-mpm.conf để cấu hình MPM

Thay đổi MPM

Mở file /etc/httpd/conf.modules.d/00-mpm.conf

     # Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines:

# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#
#LoadModule mpm_worker_module modules/mod_mpm_worker.so

# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#
#LoadModule mpm_event_module modules/mod_mpm_event.so
 

Bạn sử dụng MPM nào thì bỏ dấu comment # của dòng liên quan đến nạp MPM đó, và comment (thêm # vào đầu) các MPM khác. Như cấu hình trên đang nạp mod_mpm_prefork.so

Sau khi thay đổi thì khởi động lại Apache

service httpd restart

Chọn MPM nào?

MPM prefork

Đây là MPM mặc định khi bạn cài đặt Apache. Các tiến trình con của Apache được chạy (process), thì trong mỗi tiến trình đó chỉ có một luồng (thread) chạy để lắng nghe các yêu cầu kết nối gửi đến, cũng như xử lý các kết nối đó.

Do cách hoạt động đó - mỗi yêu cầu được xử lý trên một tiến trình riêng - độc lập, mà Apache trên server cần nhiều tài nguyên hơn các MPM khác. Tuy nhiên nó vẫn được sử dụng, có thể vì yêu cầu an toàn nào đó (các thread được cách ly riêng biệt trên nhưng process riêng) hoặc bắt buộc Apache phải sử dụng loại thư viện non-thread safe (không đa luồng) như mod_php mà MPM prefork vẫn được dùng.

Khi sử dụng MPM prefork thì những thiết lập Apache (trong httpd.conf) sau nên xem xét

StartServers 5
MaxSpareServers 10
MinSpareServers 5
MaxRequestWorkers 256
  • StartServers : thiết lập khởi tạo sẵn khi hệ thống khởi động số process chờ request gửi đến (để xử lý cùng lúc được nhiều yêu cầu, mặc định là 5, nếu nhiều RAM, CPU thì tăng lên)
  • MaxSpareServers / MinSpareServers : thiết lập số lượng process Apache lớn nhất, nhỏ nhất có thể ở chế độ chờ, lượng process chờ này do Apache tự tạo ra hay kill nó tùy thuộc vào nó đánh giá số lượng request gửi đến.
  • MaxRequestWorkers thiết lập số lượng request cùng lúc được phục vụ

Tóm lại bạn chỉ nên sử dụng MPM này nếu có yêu cầu an toàn đặc biệt hoặc cần dùng mod_php , ví loại này tốn nhiều tài nguyên, phục vụ lượng truy cập lớn kém.

MPM worker

Khác với MPM prefork, với MPM worker mỗi process có thể chạy nhiều thread (đa luồng), mỗi luồng đó lắng nghe yêu cầu, xử lý yêu cầu ... Do đó mà MPM worker xử lý cùng lúc được nhiều yêu cầu hơn MPM prefork thi cùng dùng một lượng tài nguyên.

Thiết lập quan trong của MPM worker đó là ThreadsPerChild thiết lập số luồng (thread) được tạo ra cho mỗi tiến trình (process), MaxRequestWorkers tổng số luồng được kích hoạt trong các process

Tham khảo thiết lập sau khi sử dụng MPM worker từ http://httpd.apache.org. Bạn điều chỉnh sao cho tối ưu với tài nguyên server của mình

ServerLimit         16
StartServers         2
MaxRequestWorkers  150
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25

MPM event

MPM event thực chất dựa trên MPM worker, nó được thiết kế nhằm cho phép nhiều yêu cầu được phục vụ cùng một lúc hơn bằng cách: chuyển các process đã hoàn thành cho một request sang ngay chế độ chờ request mới mà vẫn sử dụng socket cũ, có nghĩa là tình trạng keep-alive.

Đây là MPM khuyên dùng nếu có thể

Khi bạn chạy PHP với server Apache việc chọn MPM còn liên quan đến PHP handler, xem thêm: