Gk's Blog
Monday, July 13, 2009
  Disk cache cho Squid trên Linux p1
Đối với các hệ thống cache nói chung và Squid nói riêng vấn đề thiết lập cấu hình cho disk storage mang ý nghĩa rất quan trọng. Sẽ là rất tuyệt nếu bạn có nhiều RAM và sẵn sàng ném việc lưu trữ cache trên đĩa qua một bên, tuy nhiên nếu như muốn đẩy tỉ lệ hit lên cao việc dùng tới ổ cứng là không thể tránh khỏi.
Mục đích của bài viết là nhằm giúp bạn chọn được một phương án thích hợp nhất cho việc thiết lập cache trên đĩa cứng. Nếu bạn không đủ kiên nhẫn để đọc hết bài này và chỉ muốn có một cấu hình tối ưu hãy đọc phần kết luận ở cuối bài.
Yêu cầu để đọc bài này là bạn có kiến thức căn bản về hệ thống linux, đã hoặc đang có ý định sử dụng squid và quan tâm tới việc tối ưu performance của squid.
Đầu tiên chúng ta cần minh bạch giữa hai vấn đề trong lưu trữ của squid, đó là filesystem của OS nền và storage scheme của Squid. OS mà cụ thể ở đây là Linux cung cấp filesystem cho các chương trình chạy trên nó, cho phép các chương trình đó tương tác với filesystem thông qua các lời gọi hàm hệ thống (system call) ví dụ như open(), close(), read(), write()… Squid cũng như các chương trình khác sử dụng các hàm mà không quan tâm tới việc nó đang dùng filesystem nào và ở dưới filesystem này xử lý ra sao. Các filesystem thông dụng trong hệ thống linux hiện nay gồm hai loại: non-journaling (ext2) và journaling (ext3, reiserfs, ext4…). Squid có một số các storage scheme với mục đích tổ chức và truy cập các file cache nằm trên đĩa. Nói một cách hình tượng có thể coi storage scheme nằm ở tầng trên của filesystem, chúng giao tiếp với nhau qua system call nhưng không quan tâm tới hoạt động bên trong của đối phương.
Chúng ta đi vào vấn đề đầu tiên: lựa chọn filesystem, journaling hay non-journaling. Non-journaling filesystem đọc ghi thay đổi một cách trực tiếp, nghĩa là khi bạn thay đổi file và ghi lại, nội dung đó sẽ được ghi ngay vào file. Điều này dĩ nhiên là đem lại tốc độ cao nhất có thể. Journaling filesystem có cách thức khác, mỗi thay đổi không được ghi trực tiếp mà được ghi qua các file tạm gọi là journal file hay log file, sau đó mỗi khi hệ thống rỗi các thay đổi trong log file này mới được chính thức ghi vào file thực. Dễ thấy việc này sẽ làm tăng khối lượng thao tác ghi cho hệ thống, đồng nghĩa với việc làm giảm hiệu suất. Thêm nữa các hệ thống Squid thường sử dụng ghi nhiều hơn là đọc nên nếu ổ cứng của bạn có tốc độ ghi chậm và hệ thống cache của bạn rất busy thì điều này có thể dẫn đến bottle-neck. Lợi thế của journaling là ta có thể recover hệ thống một cách nhanh chóng sau khi crash điều mà non-journaling không có được. Bạn sẽ mơ ước tới nó khi cả công ty dành ra cả tiếng ngồi ngóng bạn, còn bạn thì lại đang ngồi ngóng con squid check cái phân vùng ext2 to đến vài chục GB mỗi khi mất điện đột ngột.
Một vấn đề nữa đối với filesystem là sử dụng mount options noatime. Mount options này sẽ bỏ qua việc ghi lại thời gian truy cập – điều hoàn toàn không cần thiết cho một hệ thống cache. Việc này góp phần tăng đáng kể performance.
Vậy chúng ta có 2 lựa chọn ở đây: Sử dụng ext2 với hiệu suất cao nhất nhưng phải đối mặt với việc mất data cũng như thời gian chờ đợi rất lâu. Có một số người bỏ qua nguy cơ phải chờ đợi ext2 recover bằng cách mkfs lại cache dir mỗi lần khởi động lên, đồng nghĩa với việc xóa bỏ tất cả các file cache tạo ra từ trước đó. Ngược lại nếu bạn sử dụng journaling file thì hiệu suất giảm nhưng bạn sẽ được ăn no ngủ kỹ hơn. Bạn cũng nên xem xét tới việc sử dụng reiserfs (không còn được tiếp tục phát triển) hoặc ext4 để thay thế cho ext3 mặc định (theo những benchmark gần đây hiệu suất của ext4 đã nằm ở mức xấp xỉ với ext2 và ext4 đã xuất hiện mặc định trong kernel 2.6.28).
(cont.)

Labels: ,

 

My Photo
Name:
Location: Hanoi, Vietnam
Archives
July 2009 / November 2009 / January 2010 / August 2010 / September 2010 / June 2011 / September 2013 /


Powered by Blogger

Subscribe to
Posts [Atom]