Khi vận hành một website wordpress thì chắc chắn không thể thiếu được database, các bài viết của bạn, các meta bạn seo, các thông tin đơn hàng những cấu hình các plugin bạn sử dụng … các thông tin đó đều được lưu trữ ở database.
Nếu không muốn nói khi bạn phát triển website wordpress thì chủ yếu là phát triển database 😂 😂.
Database là một khâu ăn rất nhiều tài nguyên đặc biệt là database ăn rất nhiều tài nguyên là RAM, bài viết này mình sẽ hướng dẫn các bạn cách cấu hình database tối ưu dành cho WordPress để đem lại một hiệu suất tốt nhất nhé.
Ghi chú: bài viết này chỉ dành cho những bạn đang sử dụng quản trị vps hay máy chủ riêng có tài khoản root mà thôi, bạn đang dùng share hosting thì thôi bạn không có quyền truy cập và chỉnh sửa cái này.
Giờ chúng ta cùng nhau bắt đầu nhé.
Tất cả các công thức này mình tự đúc rút kinh nghiệm của mình và học hỏi từ những chuyên gia wordpres và chuyên gia database trên thế giới, bạn cũng cân nhắc đừng quá mù quáng khi lắng nghe mình tốt nhất hãy tự bạn chính mình kiểm chứng điều đó.
Bài viết này khác với những đa phần khác với bài viết khác trên thị trường là cho cài này cố định cài này quá khuôn mẫu, ông blog cấu hình chả khác gì ông website bán hàng thế thì toang, ông máy chủ ram 8gb mà cấu hình như ông máy chủ chỉ có ram 1gb thì hỏng hẳn.
Những chia sẻ của mình ở đây đề là mình đúc kết lại và tính toán có công thức bạn có thể áp dụng sao cho phù hợp với cấu hình máy chủ của bạn và nhu cầu website của bạn nhất.
Nếu khó quá thì liên hệ cho mình: dịch vụ thiết lập openlitespeed từ a đến z mình sẵn sàng phục vụ.
quảng cáo thế thôi giờ chùng mình quay trở về chủ đề chính nhé.
Mục lục
Sử dụng innodb thay vì myisam
Innodb đem lại hiếu suất tốt hơn myisam nhưng myisam ra đời trước lên được các nhà phát triển ưu ái hơn về mặt công nghệ hơn chút, nhưng chung quy lại mình vẫn khuyên cáo mọi người sử dụng WordPress thì sử dụng innodb thay vì myisam.
Công nghệ lưu trữ database từ MyISAM sang InnoDB
Có rất nhiều cách chuyển đổi từ innodb sang myisam bạn có thể sử dụng các plugin wordpress hỗ trợ, bạn có thể sử dụng dụng phpmyadmin (khuyến cáo làm cách này rất lâu và tốn thời gian), bạn có thể sử dụng wp cli (cách yêu thích của mình khi muốn chuyển myisam sang innodb)…
Nếu bạn sử dụng wptangtoc ols thì mình cũng có viết ra tính năng này là bạn có thể chuyển đổi một cách hết sức dễ dàng.
innodb_buffer_pool_size
Công cụ InnoDB có một vùng cache được sử dụng để lưu dữ liệu và index vào bộ nhớ RAM. Điều này tất nhiên sẽ giúp các truy vấn MySQL / MariaDB của bạn được thực thi nhanh hơn rất đáng kể.
Việc chọn kích thước thích hợp ở đây đòi hỏi một số quyết định rất quan trọng và kiến thức tốt về mức tiêu thụ bộ nhớ RAM của hệ thống của bạn.
Đây là những gì bạn cần xem xét:
Hãy cung cấp khoảng 60-70% bộ nhớ RAM cho innodb_buffer_pool_size. (Ram trên 6gb thì mình thường sẽ nhân cho 70% còn nếu ram dưới 6gb thì mình nhân cho 60% )
Giá trị mà bạn chỉnh sửa trong file : /etc/my.cnf
hoặc /etc/my.cnf.d/server.cnf
là:
ví dụ như máy chủ của mình chỉ có 2gb thì quy đổi 2GB bằng 2048MB mình sẽ tính là: 2048M x 60% = 1228M
innodb_buffer_pool_size= 1228M
Bạn hãy tính sao cho giá trị phù hợp nhất với bạn, Đưa đoạn lệnh này vào file /etc/my.cnf
hoặc /etc/my.cnf.d/server.cnf
cho vào dòng cuối cùng của file rồi reboot lại database.
Mỗi khi bạn config 1 thứ gì đó trong database bài viết này bạn bắt buộc phải reboot lại database để giá trị có thể được xác nhận.
systemctl restart mariadb.service
Swap database
swap không giúp webserver của bạn hoạt động nhanh chóng hơn, đôi khi nếu bạn cấu hình quá lố (Tham Lam) gấp hơn 3 lần số ram hiện tại nó lại là thứ phản tác dụng.
swap mình khuyến cáo không nên sử dụng, nhưng cũng tuỳ vào hoàn cảnh điều kiện mỗi người.
swap là bạn lấy 1 phần ổ cứng ra để làm ram, tốc độ ổ cứng thì không thế nhanh bằng ram được (nếu nhanh bằng ram thì chắc chắc các nhà khoa học máy tính sẽ không sinh ra RAM làm gì, truy suất cpu trực tiếp từ ổ cứng luôn tiết kiệm mua ram tốn thêm tiền tốn sức phát triển… vì lý do tốc độ nên RAM là thứ không thể thiếu trong gần như mọi bộ máy tính…)
swap bạn chỉ lên kích hoạt khi bạn nghèo quá không có tiền mua thêm ram, cũng chỉ là cầm cừ thay vì sập ngừng hoạt động hệ thống database swap cố gắng cầm cự cho bạn, để bạn có thời gian alo cho nhà cung cấp dịch vụ để bạn thuê thêm thanh ram, ram máy chủ thị trường giờ cạnh tranh giờ thuê khá là rẻ. Đừng tiết kiệm quá mức thành keo kiệt đó.
Hãy tính toàn bài kinh doanh tổng thể của bạn, mỗi tháng bạn thuê thêm ví dụ bỏ 100k ra thuê thêm ram thế này nó đem lại tốc độ thế này thì nó đem lại cho bạn bao nhiêu doanh thu và lợi nhuận khách hàng hài lòng với website của bạn thế nào…
Cách vô hiệu hoá swap.
sysctl -w vm.swappiness = 0
max_connections
Các max_connections chỉ thị cho webserver của bạn có bao nhiêu kết nối đồng thời được chấp nhận. Kết nối chỉ được mở trong thời gian truy vấn MySQL được thực thi – sau đó nó được đóng và kết nối mới có thể thay thế.
Hãy nhớ rằng quá nhiều kết nối có thể gây ra việc sử dụng RAM cao và khóa máy chủ MySQL của bạn.
Công thức: (số nhân core cpu x ulimit (1024)) : 6 = max_connections
Ví dụ: tôi có con vps 2 nhân cpu thì mình sẽ tính là: (2 x 1024) : 6 = 341
max_connections = 341
Giá trị mà bạn chỉnh sửa trong /etc/my.cnf
hoặc /etc/my.cnf.d/server.cnf
bạn cho xuống dòng cuối cùng. rồi reboot lại mysql / maria database
Vô hiệu hóa MySQL Reverse DNS Lookups
Theo mặc định, MySQL / MariaDB thực hiện tra cứu DNS của địa chỉ IP / Tên máy chủ của người dùng mà từ đó kết nối đến.
hostname mysql / maria phân giải dns, rồi có ip rồi thực thi đối chiếu xác thực rồi mới thực thị lệnh hơi loằng ngoằng
Vì hơi loằng ngoằng tính năng này không có giá trị gì với những website wordpress, điều này có thể gây ra sự chậm trễ trong trường hợp DNS bị cấu hình sai hoặc sự cố với máy chủ DNS. Đây là lý do tại sao bạn có thể tắt tra cứu DNS ngược bằng cách thêm thông tin sau vào tệp cấu hình của mình:
skip-name-resolve
Kỹ thuật này giúp database của bạn cải thiện giảm rất nhiều độ trễ delay của database đem lại hiếu suất tốc độ tốt hơn.
query_cache_size
Nếu bạn có nhiều truy vấn lặp lại và dữ liệu của bạn không thay đổi thường xuyên thường wordpress theo mình thì đa phần website cũng ít khi thay đổi- lời khuyên của mình hãy sử dụng bộ nhớ đệm truy vấn.
Mọi người thường không hiểu khái niệm đằng sau query_cache_size
và đặt giá trị này thành gigabyte (GB) cho nó máu, điều này thực sự có thể gây ra sự suy giảm hiệu suất tốc độ của bạn (tự tay bóp cái đó (chỗ hiểm)).
Lý do đằng sau đó là một thực tế là các luồng cần khóa cache trong quá trình cập nhật. Thông thường giá trị 200-350 MB là quá đủ cho website wordpress. Nếu website của bạn tương đối nhỏ chỉ là blog cơ bản, trang giới thiệu doanh nghiệp cơ bản, bạn có thể thử đưa ra giá trị 64M và tăng dần theo thời gian nếu database to và hay nhu cầu cao hơn.
Tôi ví dụ: website wordpress cơ tầm trung bình khoảng 800 trang web chạy woocommerce chạy traffic tốt cấu hình ví dụ:
query_cache_type = 1 query_cache_limit = 5M query_cache_min_res_unit = 4k query_cache_size = 300M
tmp_table_size và max_heap_table_size
Cả hai tmp_table_size và max_heap_table_size phải có cùng kích thước dung lượng và sẽ giúp bạn ngăn chặn việc sử dụng database trên disk ổ cứng hãy hãy cho sử dụng vào RAM. (RAM hiệu suất tốt hơn là ổ cứng) Là tmp_table_size dung lượng kích thước tối đa của các bảng trong bộ nhớ RAM. Trong trường hợp vượt quá giới hạn được đề cập được cấu hình, bảng sẽ được chuyển đổi thành bảng MyISAM sử dụng trên ổ cứng disk.
Điều này sẽ ảnh hưởng đến hiệu suất tốc độ cơ sở dữ liệu database.
Công thức: số ram trên hệ thống đơn vị là GB của bạn x với 64M.
Ví dụ: mình có vps khoảng 4gb thì mình sẽ tính là 4 x 64M = 256M
tmp_table_size= 256M max_heap_table_size= 256M
Bạn hãy tính sao cho giá trị phù hợp nhất với bạn, Đưa đoạn lệnh này vào file /etc/my.cnf
hoặc /etc/my.cnf.d/server.cnf
cho vào dòng cuối cùng của file rồi reboot lại database.
Ngủ đông của truy vấn database
Sự kiện ngủ đông sẽ xuất hiện khi code đang sử dụng kết nối liên tục với cơ sở dữ liệu. Khi sử dụng PHP, sự kiện này có thể xuất hiện khi sử dụng mysql_pconnect mở kết nối, sau đó thực hiện các truy vấn, loại bỏ xác thực và để kết nối mở. Điều này sẽ làm cho bất kỳ bộ đệm trên mỗi luồng được giữ trong ram cho đến khi luồng chết.
(làm webserver RAM là tài nguyên quý nhất hệ thống như thế này thì lãng phí, yêu thì yêu không yêu trả dép bố còn về không có đợi chờ, đợi chưa bao giờ là hạnh phúc)
wait_timeout. Giá trị mặc định được được cấu hình là 28800 giây, trong khi bạn có thể giảm giá trị xuống một cách an toàn như 60 :
wait_timeout=60
Đưa đoạn lệnh này vào file /etc/my.cnf
hoặc /etc/my.cnf.d/server.cnf
cho vào dòng cuối cùng của file rồi reboot lại database.
Tắt ghi log database
Gần như rất nhiều người cũng không có thời gian đọc log mà tận chí chả biết log để làm cái gì, log giúp ích gì, file log database nằm ở đâu muốn đọc thì phải thế nào… nhưng thì bạn để chế độ ghi logs thì thực sự như vậy rất là lãng phí tài nguyên máy chủ.
Khi bạn bật chế độ ghi logs thì máy chủ cũng phải tốn tài nguyên công sức bỏ ra ghi những dòng log mà dòng log đó bạn không đọc không giúp gì bạn thì bạn hãy tắt ghi log đi, tài nguyên đó thì để bạn phục vụ những chuyện khác.
skip-log-bin
Thread_cache_size
Các thread_cache_size chỉ thị đặt số lượng bài mà máy chủ của bạn nên bộ nhớ cache. Khi máy khách ngắt kết nối, các luồng của anh ta sẽ được đưa vào bộ nhớ đệm nếu chúng nhỏ hơn thread_cache_size . Các yêu cầu khác được hoàn thành bằng cách sử dụng các chuỗi được lưu trữ trong bộ nhớ cache.
Nếu bạn muốn cấu hình được một số thấp hơn với nguồn lực và nhu cầu hiện tại của bạn, điều đó có nghĩa là hầu hết các kết nối mysql mới đang bắt đầu luồng mới thay vì tải từ bộ nhớ cache. Bạn chắc chắn sẽ muốn tăng kích thước thread_cache_size trong những trường hợp như vậy.
Giá trị của cache thì chắc theo dõi blog của mình thì ai cũng rõ là đem lại hiệu suất tốc độ tốt hơn rất nhiều mà giảm tải rất tốt tài nguyên máy chủ…
Để cải thiện hiệu suất của mình, bạn có thể đặt thread_cache_size thành một số tương đối cao. Để tìm tỷ lệ truy cập bộ nhớ cache chuỗi, bạn có thể sử dụng công thức sau:
100 – ((Threads_create : Connections) x 100)
Đi tìm: Threads_create và Connections ở trong công thức
Bước 1: bạn vào terminal gõ mysql
Bước 2: bạn gõ: show status like 'Threads_created';
Bước 3: bạn gõ: show status like 'Connections';
Bước 4: khi đã có đầy đủ xem cá giá trị dữ liệu đủ rồi lưu lại rồi gõ: exit
để thoát ra
Ví dụ ở đây: 100 – ((3: 16) x 100) = 81
thread_cache_size = 81
Giá trị mà bạn chỉnh sửa trong /etc/my.cnf hoặc /etc/my.cnf.d/server.cnf bạn cho xuống dòng cuối cùng. rồi reboot lại mysql / maria database
max_allowed_packet
Cái này thì không đem lại hiệu suất tốc độ gì, nhưng nó giúp bạn thực thi database không bị lỗi nếu trong trường hợp database của bạn quá nặng.
Nếu database của bạn tầm 200MB trở lên thì mới cần phải quan tâm về cái này còn dưới thì thôi không quan trọng lắm.
mặc định max_allowed_packet được cấu hình là 16MB đối với những website database nhỏ thì quá đủ dùng rồi không cần bận tâm nữa nhưng với website có dung lượng database khủng 1 bảng nó lớn hơn 16MB thì sẽ bị lỗi đặc biệt là bảng wp-option rất phổ biến của wordpress.
Công thức tính: file dung lượng database.sql khi xuất backup ra : chia 8
Giả sử tôi có file database khoảng 250M thì tính là 250 : 8 = 31MB
max_allowed_packet= 31M
Giá trị mà bạn chỉnh sửa trong /etc/my.cnf hoặc /etc/my.cnf.d/server.cnf bạn cho xuống dòng cuối cùng. rồi reboot lại mysql / maria database
key_buffer_size
key_buffer_size là một biến MyISAM xác định kích thước của cache index được giữ trong bộ nhớ RAM, ảnh hưởng đến tốc độ đọc chỉ mục index.
Nếu bạn hoàn toàn không sử dụng bảng MyISAM mà bạn sử dụng innodb như lúc đầu bài viết mình nói, bạn có thể đặt giá trị này thành giá trị rất thấp, chẳng hạn như 64K không thì bỏ qua kệ nó.
Công thức tính key_buffer_size: số lượng ram của hệ thống x với 20%
ví dụ như: mình có vps ram 2gb mình sẽ quy đổi thành 2048MB thì sẽ tính thế này: 2048MB x 20% = 409M
key_buffer_size = 409M
Kết luận:
Mình hy vọng những chia sẻ này có thể giúp ích cho bạn trong quá trình tối ưu hoá database của bạn, tại WPTangToc có rất là nhiều kỹ thuật tối ưu hoá database khác nhau bạn có thể tham khảo nhé.
Để lại một bình luận