Nhiều người nghĩ rằng nâng cấp phần cứng là cách tốt nhất để tăng tốc độ cho server. Tăng bộ nhớ hoặc CPU có thể cung cấp hiệu suất tốt hơn. Nhưng, nâng cấp phần cứng chỉ là cách xử lý thời tạm thời, nếu các services chạy trên server không được tối ưu hóa. Phần lớn các ứng dụng trực tuyến được lưu trữ sử dụng một server web (front-end) và một server database (back-end). Qua thời gian, các services có xu hướng ngốn CPU, bộ nhớ, I/O khiến chúng bị thắt nút cổ chai dẫn đến hiệu suất kém hoặc thậm chí server bị crash. Vì vậy chúng ta cần phải thường xuyên theo dõi tình trạng server qua các trình monitoring để xử lý kịp thời mỗi khi server có điều gì bất thường như trang web trở nên chậm chạp tránh việc server bị crash.

Làm thế nào để tăng tốc Web và Database services

Hôm nay chúng ta hãy nhìn vào các thiết lập phổ biến nhất mà chúng ta đã thực hiện. Như một ví dụ, chúng ta sẽ xem làm thế nào các services như Apache và MySQL có thể được tối ưu hóa trên server Linux chạy cPanel hay Plesk.

1. Tối ưu hóa Apache

File cấu hình của Apache được đặt tại “/usr/local/apache/conf/httpd.conf” trong một server cPanel và tại “/etc/httpd/conf/httpd.conf” trong một server Plesk. Bước đầu tiên là để đo hiệu suất hiện tại của máy chủ web. Bạn có thể sử dụng ab để benchmark máy chủ. Nếu bạn nhận được lỗi “command not found” khi chạy ab, bạn có thể sử dụng đường dẫn tuyệt đối file binary của ab, ví dụ /usr/local/apache/bin/ab trong một server cPanel. Nếu bạn thấy nó quá phức tạp, hãy sử dụng bất kỳ công cụ trực tuyến để đo hiệu suất. Bước tiếp theo là thay đổi các chỉ thị trong file cấu hình. Xin lưu ý rằng bạn sẽ phải khởi động lại Apache (/etc/init.d/httpd restart) để các thay đổi có hiệu lực. Các chỉ thị phổ biến mà bạn có thể thay đổi là:

Timeout

Chỉ thị “Timeout” được sử dụng để xác định số lượng thời gian Apache sẽ chờ một request GET, POST, PUT và ACKs trên đường truyền trước khi nó tự động ngắt khi thời gian nghỉ vượt quá giá trị này. Giá trị mặc định của Timeout là 60, tôi thường thiết lập với giá trị 120. Tuy nhiên, nó được khuyến khích để thiết lập giá trị này thấp hơn nếu khách hàng của bạn có thời gian trễ thấp. Trong một số trường hợp, thiết lập chỉ thị này đến một giá trị thấp có thể gây ra vấn đề. Điều này rất phụ thuộc vào mạng và máy chủ của bạn thiết lập. Các tốt nhất là để thử nghiệm với các giá trị khác nhau để tìm một trong đó phù hợp với nhu cầu của bạn.

KeepAlive

Chỉ thị “KeepAlive” nếu để là “On”, cho phép kết nối liên tục trên máy chủ web. Đối với hiệu suất tốt hơn, nó được đề nghị để thiết lập tùy chọn này để “On” và cho phép nhiều request cho mỗi kết nối.

MaxKeepAliveRequests

Chỉ thị này được sử dụng để xác định số lượng requests cho phép mỗi kết nối khi tùy chọn KeepAlive trên được thiết lập để “On”. Khi giá trị của tùy chọn này được thiết lập để “0” có nghĩa rằng cho phép không giới hạn số lượng requests trên server. Để tăng hiệu suất máy chủ, nên cho phép không giới hạn số lượng requests.

KeepAliveTimeout

Chỉ thị này được sử dụng để xác định bao nhiêu thời gian, chỉ trong vài giây, Apache sẽ chờ đợi cho một request tiếp theo trước khi đóng kết nối. Khi một request đã được nhận, giá trị thời gian chờ quy định của “Timeout” chỉ được áp dụng. Đối với các web server nhận được hơn 200 kết nối tại bất kỳ thời điểm nào, tôi thường để giá trị KeepAliveTimeout bằng “10” là một thiết lập tốt cho hiệu suất máy chủ. Giá trị này nên được giữ ở mức thấp như các socket sẽ được nhàn rỗi trong thời gian dài khác.

MaxClients

Chỉ thị này được sử dụng để xác định giới hạn về số lượng các tiến trình con sẽ được tạo ra để phục vụ request. Mặc định nghĩa là lên đến 512 requests HTTP có thể được xử lý đồng thời. Đây là một tham số điều chỉnh quan trọng về hiệu suất của máy chủ web Apache. Đối với hoạt động tải trọng cao, giá trị “512” được khuyến khích. Để sử dụng tiêu chuẩn, bạn có thể thiết lập giá trị “256”.

MinSpareServers

Chỉ thị này được sử dụng để xác định số lượng tối thiểu của các idle process con cần được tạo. Một idle process trong đó là không xử lý một request. Nếu có ít hơn “MinSpareServers” idle process, thì process cha tạo ra con mới với tốc độ tối đa của 1 mỗi giây. Thiết lập này phải phù hợp với bao nhiêu kết nối mới mà bạn mong đợi mỗi giây. Với kinh nghiệm của tôi, tôi thấy rằng một giá trị MinSpareServers 10 là thích hợp cho các máy chủ nhận được lên đến 300 kết nối đồng thời.

MaxSpareServer

Chỉ thị này được sử dụng để xác định số lượng tối đa của các idle process con cần được tạo. Nếu có nhiều hơn “MaxSpareServers” idle process, thì process cha sẽ kill các process dư thừa và các process bổ sung này sẽ được chấm dứt. Giá trị idle là 15.

MaxRequestsPerChild

Tùy chọn này “MaxRequestsPerChild” được sử dụng để xác định số lượng requests rằng một process con cá biệt sẽ xử lý. Đặt chỉ thị này để “0” để có được hiệu suất tối đa và khả năng mở rộng cho các máy chủ.

HostnameLookups

Chỉ thị này nếu thiết lập để “Off”, quy định cụ thể để vô hiệu hóa các tra cứu DNS. Đó là khuyến cáo để thiết lập tùy chọn này để “Off” để tránh độ trễ để mọi yêu cầu, để tiết kiệm thời gian lưu lượng mạng, và để cải thiện hiệu suất của máy chủ web Apache.

2. Tối ưu hóa MySQL

Một khi bạn đã hoàn thành việc tối ưu hóa Apache, bạn có thể tiến hành với việc tối ưu hóa MySQL. Như trong trường hợp của Apache, bạn sẽ phải thực hiện tinh chỉnh thiết lập trong tập tin cấu hình của MySQL. Tập tin này được đặt tại “/etc/my.cnf” trong các máy chủ cPanel và Plesk. Bạn sẽ phải khởi động lại máy chủ MySQL (/etc/init.d/mysqld restart) sau khi thực hiện bất kỳ thay đổi file cấu hình. Để làm được điều này có thể có được một chút kỹ thuật, và nhận được những giá trị đúng cần kinh nghiệm quản trị hệ thống. Một cách dễ dàng hơn là sử dụng MySQL tuning scripts. Có một vài điều mà chúng tôi tìm thấy hữu ích. Một trong những scripts là MySQLTuner. Nó là một kịch bản perl và bạn có thể chạy nó bằng cách sử dụng lệnh perl mysqltuner.pl. Điều này sẽ liệt kê những thay đổi mà bạn sẽ phải thực hiện với file cấu hình.
# wget http://mysqltuner.pl/mysqltuner.pl
# perl mysqltuner.pl
>> MySQLTuner 1.2.0 ­ Major Hayden <major@mhtx.net>
>> Bug reports, feature requests, and downloads at http://mysqltuner.com/
>> Run with ‘­­helpfor additional options and output filtering
Output của script sẽ như sau:
Variables to adjust:
query_cache_size (>= 8M)
join_buffer_size (> 128.0K, or always use indexes with joins)
thread_cache_size (start at 4)
table_cache (> 64)
innodb_buffer_pool_size (>= 33M)
Vì vậy, bạn cần phải thiết lập các query_cache_size tới 8MB hoặc nhiều hơn. Bạn có thể thêm những “query_cache_size = 8M” trong tập tin cấu hình MySQL để thực hiện điều này. Tương tự thực hiện thay đổi các chỉ thị khác, khởi động lại service MySQL và chạy tuning script một lần nữa. Tất nhiên, có những kiến nghị script tạo ra với một chút sạn, bởi vì nó không xem xét các nhu cầu tài nguyên của các services khác trong hệ thống. Vì vậy, nếu bạn thiết lập memory_limit MySQL quá cao, nó có thể giết chết các web hay mail service đang chạy trong cùng một máy chủ. Nhiều lần, tôi đã nhìn thấy tài nguyên trong phân bổ trong các server MySQL dẫn đến tắc nghẽn bộ nhớ, và cuối cùng bị crash server. Tối ưu hóa một máy chủ không phải là chỉ giới hạn chỉnh Apache và MySQL. Bạn có thể tinh chỉnh các dịch vụ khác, chuyển sang máy chủ web thay thế như Nginx, lên lịch tác vụ sử dụng tài nguyên cao như sao lưu vào giờ cao điểm,… để cải thiện hiệu suất.