Thik
Bác benchmark xong cho em cái kết quả tham khảo.
haiz, sau vài tuần vật vã với mariaDB, dùng đủ các phương thức vẫn ko thể nào tăng đc performance lên. Quyết định chuyển sang dùng redis + manual index vào solr. sau khi chạy thử nghiệm cảm giác đây đúng là lựa chọn đúng đắn.
nói qua về web mình làm, mô hình quan hệ giữa các thực thể:
tag -> clip_tag <-> clip <-> clip_category <- category
clip -> avatar (đã bị drop, và chuyển qua cơ chế khác ko cần lưu)
mô hình thực sự là rất đơn giản, nhưng lượng dữ liệu quá lớn thành ra là performance rất chậm, mặc dù đã index lại đủ kiểu, sử dụng khá nhiều memcached nhưng bản chất thói quen người dùng là vào site, search clip, click vào xem clip. thế nên rất khó để mà chủ động tạo cache. một cái clip thì có đến tận gần 30 avatar, một clip có đến độ khoảng 20 tag, 3-4 category

Đây là ảnh db size:
Cấu hình svr:
4 core intel xeon (xin giấu một số thông tin

)
4GB Ram
Network 1Gbit
Web chưa đẩy visit vào, 1 ngày đc khoảng 1k, MariaDB chạy lúc nào cũng ở khoảng ~600MB Ram, CPU 24~26%. Như vậy là khá cao, mặc dù tất cả các trang đã cache output html. Lý do duy nhất mình chưa đẩy visit vào là vì web quá chậm.
Mình quyết định bỏ thời gian, chuyển hết dữ liệu qua redis (nếu làm từ đầu thì đúng là đã chả khổ như này). Gần 1 tuần làm việc, do đây là mình làm part time, nên thời gian ko làm liên tục đc, tính ra chắc chỉ làm đc khoảng 4 đêm, mỗi đêm làm khoảng 4 tiếng từ 10h tối đến 2h sáng. Và đây là thành quả:
Biểu đồ hiện thị khá rõ: biểu đồ phía trên hiển thị thời gian client cần để hoàn thiện 1 request (bao gồm cả DOM loaded); biểu đồ dưới là thời gian mà server cần để hoàn thiện một request, rồi trả response về phía client.
Biểu đồ chia làm 2 đoạn, trước và sau Downtime. Downtime ở đây là thời gian chuyển đổi từ MariaDB sang Redis.
Lúc dùng MariaDB thì PHP dùng các extension sau: Memcache, APC, PDO::MySQL.
Lúc chuyển qua dùng Redis: ERedis (cái này là lib mình custom build để connect vào Redis), APC, Memcache.
Memcache, PDO, ERedis chọc thẳng vào unix socket để tiết kiệm TCP Connection. APC dùng để cache opcode.
Nhìn qua biểu đồ có thể thấy rõ ràng là trc khi chuyển qua redis, thời gian nhiều nhất để xử lý một requets là tiến trình Database. Ở đây tiến trình DB gần chạm đến mốc 10k ms ~ 10s, các tiến trình khác thậm chí ko đủ to để hiển thị trên biểu đồ. Sau khi chuyển qua redis, thì thậm chí là toàn bộ thời gian để hoàn tất request còn ko đủ để hiển thị trên biểu đồ

Qua benchmark vớ vỉn, thì dùng lệnh MGET từ PHP, lấy khoảng 1000 key ra, mỗi key có giá trị dài khoảng 300 ký tự, mất khoảng 3ms

Mình cũng định lập lại một con chạy trên MariaDB để dùng Apache Benchmark so sánh với con chạy Redis hiện tại, nhưng lười quá, khi nào rảnh sẽ làm.