Nghe nhiều nhưng bạn đã hiểu về caching, một kĩ thuật phổ biến để tăng hiệu năng máy tính?

    Quốc Đạt,  

    Trong bài này, xin giới thiệu với anh em về Caching, một kĩ thuật tăng hiệu năng của máy tính được sử dụng cực kì phổ biến. Đây là series bài viết gồm 2 phần, phần 1 mình sẽ giải thích nguyên lý cơ bản của cache, và những cách áp dụng cache phổ biến trong thực tế. Phần 2, mình sẽ giải thích CPU máy tính sử dụng cache như thế nào.

    Cache là gì?

    Caching, hay lưu cache là một kĩ thuật nhằm tăng hiệu năng của một hệ thống máy tính. Nó hoạt động dựa trên một cơ chế: lưu trữ một bản sao của dữ liệu thường xuyên được truy xuất ở một nơi mà có tốc độ truy xuất nhanh hơn so với vị trí gốc, nhờ đó, tốc độ hoạt động chung của hệ thống được tăng lên. Vị trí gốc được gọi là backing store, còn vị trí có tốc độ truy xuất nhanh hơn kia gọi là cache (tiếng Việt hay gọi là bộ nhớ đệm).

    Vì sao kĩ thuật này lại được sử dụng? Điều gì cũng có nguyên do của nó. Trong cuộc sống thực tế, chúng ta hay bắt gặp những tình huống tổng quát như thế này:

    Bạn có 10 tệp dữ liệu, được đánh số từ 1 đến 10. Lần đầu tiên bạn truy cập vào tệp số 3, thì khả năng cao trong vài lần truy cập tiếp sau đó, bạn tiếp tục truy cập vào tệp số 3 hoặc một vài tệp lân cận (2 hoặc 4)

    Một ví dụ gần gũi nhất đó là việc lập trình. Giả sử bạn là lập trình viên front-end Angular, source code dự án của bạn có hàng trăm file nhưng trong quá trình làm việc thực tế, bạn hiếm khi mở rải rác các file ở các thư mục khác nhau, mà bạn thường xuyên truy cập vào các files trong cùng một thư mục nhất định (ví dụ azo-detail).

    Nghe nhiều nhưng bạn đã hiểu về caching, một kĩ thuật phổ biến để tăng hiệu năng máy tính? - Ảnh 1.

    Những tình huống như thế này được gọi là Tính truy xuất cục bộ (Locality of reference).

    Đây là một số ví dụ thêm để bạn dễ hình dung hơn:

    - Giả sử người dùng lên Internet download một bức ảnh nào đó (logo / banner), thì sau khi download xong, khả năng cao là bức ảnh đó sẽ được truy xuất để mở lên.

    - Giá sách của bạn có 10 cuốn sách, trong đó có một cuốn tiểu thuyết rất dày và bạn dự tính rằng mỗi ngày đọc 1 tiếng thì phải 1 tháng mới hết. Vậy từ ngày đọc sách thứ 2 trở đi, khả năng bạn cầm cuốn tiểu thuyết đang đọc dang dở đó lên là cao hơn hẳn so với các cuốn sách khác

    - Giả sử bạn vào GenK và bấm vào danh mục và xem một bài trong đó, thì khả năng cao sau khi đọc xong, bạn sẽ đọc tiếp một bài trong cùng danh mục đó.

    Vậy nếu một hệ thống có sử dụng cache, lần đầu khi có request dữ liệu (cache miss), hệ thống sẽ load dữ liệu đó từ backing store, đồng thời lưu một bản sao tại cache. Những lần request tiếp sau, dữ liệu sẽ được load từ cache (cache hit).

    Nghe nhiều nhưng bạn đã hiểu về caching, một kĩ thuật phổ biến để tăng hiệu năng máy tính? - Ảnh 2.

    Như vậy, nếu bộ nhớ cache càng lớn thì hiệu năng lại càng cao nhưng đồng nghĩa với đó là chi phí sản xuất càng lớn. Bộ nhớ cache lớn đến cỡ nào là một bài toán cân đối giữa hiệu năng / chi phí. Nhưng cho dù dung lượng của cache có lớn thế nào đi nữa thì đến một lúc nào đó nó sẽ đầy. Để tiếp tục sử dụng, chúng ta phải làm nó vơi đi bằng cách bỏ đi những dữ liệu ít có khả năng truy cập nhật lại nhất. Có 2 thuật toán phổ biến để quyết định xem dữ liệu nào cần được bỏ ra khỏi cache:

    LRU (Least Recently Used), tức dữ liệu nào càng được truy xuất gần nhất thì ưu tiên giữ lại. Giả sử bộ cache đã đầy và hiện có lưu 3 trường dữ liệu là data1, data2, data3. Lần truy xuất gần nhất tương ứng là 5 phút trước, 2 phút trước và 3 phút trước. Bây giờ, theo ta muốn lưu thêm data4 vào cache thì ta giữ lại data2 và data3, bỏ đi data1.

    TLRU (Time-aware LRU), chỉ khác thuật toán trên ở chỗ, mỗi trường dữ liệu trong cache có gắn thêm thông số là thời gian hết hạn, nên mỗi khi cái nào hết hạn thì nó sẽ tự động bị loại khỏi cache.

    Nghe nhiều nhưng bạn đã hiểu về caching, một kĩ thuật phổ biến để tăng hiệu năng máy tính? - Ảnh 3.

    Ví dụ cache đang chứa những dữ liệu như thế này, thời điểm hiện tại (theo UNIX time) là 1500000100 thì dữ liệu với key bằng 431 sẽ bị loại bỏ khỏi cache.

    Cách này có rất nhiều lợi ích:

    Đảm bảo được một loại data nhất định nào đó sẽ được load lại theo đúng chu kì, và chu kì này thì do mình quyết định. Ví dụ, trang thương mại điện tử quốc tế có niêm yết giá bán bằng các loại tiền tệ khác nhau, có thể dùng cách này để update tỉ giá theo giờ.

    Khi xuất hiện nhiều tình huống truy xuất nội bộ đối với một tập dữ liệu nhất định, chúng ta có thể điều chỉnh cái thời gian hết hạn này để quyết định lưu cái nào lâu hơn, bỏ cái nào sớm hơn.

    Những cách update dữ liệu khi dùng cache

    Trong thực tế, có nhiều tình huống chúng ta muốn update dữ liệu thì có nhiều hướng xử lý khác nhau, tuỳ thuộc vào hệ thống. Nhìn chung, có 2 nhóm cách làm:

    Update dữ liệu ở cả cache và backing store.

    Nhóm này lại chia làm 2 cách là:

    Write back: Cập nhật dữ liệu ở trong cache xong xuôi trước, rồi tiến hành cập nhật dữ liệu ở backing store. Cách này này có ưu điểm là tối ưu được hiệu năng, nhưng sẽ có rủi ro về mất mát dữ liệu nếu như hệ thống gặp sự cố khi chưa kịp cập nhật dữ liệu ở backing store

    Write through: Cập nhật dữ liệu song song ở cả cache và backing store. Cách này sẽ đảm bảo dữ liệu ở cache và backing store luôn được đồng bộ với nhau, tuy nhiên sẽ phải đánh đổi lại về mặt hiệu năng hệ thống.

    Chỉ update dữ liệu ở backing store

    Invalidate cache: hệ thống sẽ gửi một yêu cầu vô hiệu hoá những dữ liệu nào trong cache, thậm chí là toàn bộ. Những lần truy cập tiếp theo thì dữ liệu sẽ load từ backing store vừa được update.

    Versioning: tạo ra một phiên bản khác so với phiên bản ở trong cache. Cách này rất dễ thấy khi code web, lập trình viên thường gắn thêm một tham số đằng sau đường dẫn tham chiếu đến file css, hoặc những image tĩnh như file logo. Khi sửa file css, hoặc thay đổi logo, người lập trình viên chỉ cần thay đổi cái biến $version khác đi (thủ công hoặc bằng lệnh) là người dùng thấy được sự cập nhật mới nhất. Data cũ ở trong cache vẫn được lưu, nhưng ở đây, ta đang request dữ liệu với một key khác không tồn tại trong cache.

    Nghe nhiều nhưng bạn đã hiểu về caching, một kĩ thuật phổ biến để tăng hiệu năng máy tính? - Ảnh 4.

    Những ứng dụng phổ biến của cache

    Page cache

    Khi một chương trình máy tính được mở lên, máy tính có thể load toàn bộ hoặc một phần mã nguồn (đã được biên dịch) vào trong RAM để dễ dàng truy xuất dữ liệu bởi vì tốc độ truy xuất dữ liệu từ RAM bao giờ cũng lớn hơn tốc độ truy xuất dữ liệu từ ổ cứng. Lúc này, RAM chính là cache còn ổ cứng máy tính chính là backing store.

    Cache của trình duyệt web

    Khi bạn truy cập vào một trang web lần đầu, các tài nguyên tĩnh của trang web đó như file css, file js, image tĩnh (logo, icons) sẽ được lưu lại tại máy của bạn. Những lần truy cập tiếp theo, thì máy của bạn sẽ load những tài nguyên này từ ngay trong máy chứ không phải lấy từ server nữa, giúp tiết kiệm băng thông và tăng tốc độ tải trang.

    Cache dữ liệu là kết quả của một quá trình tính toán nặng

    Backing store thường là những nơi có khả năng lưu trữ dữ liệu lớn nhưng lại có tốc độ truy xuất thấp. Tuy nhiên, backing store cũng có thể được hiểu là những tác vụ nặng, thời gian tính toán cho ra kết quả lâu.

    Giả sử, bạn thiết kế một chương trình giải đố cho hàng nghìn người tham gia. Trước khi bắt đầu giải một câu đố, mỗi người chơi sẽ được biết một dữ liệu là: thời gian trung bình để giải được câu đố này. Con số này được tính toán bằng cách lấy số trung vị (median) của mảng thời gian hoàn thành câu đấu của những người chơi trước đó. Như vậy, để đưa ra được con số này, hệ thống sẽ phải sắp xếp mảng thời gian kia, rồi từ đó mới tìm ra được trung vị. Tác vụ sắp xếp mảng là một tác vụ có độ phức tạp là O(n log n)(với n là số phần tử của mảng).

    Như vậy, nếu mỗi lần chơi, hệ thống đều phải tính toán con số này thì hiệu năng của hệ thống sẽ bị ảnh hưởng rất lớn. Giải pháp đưa ra là cache lại kết quả này và gửi cho người dùng, bởi vì dù sao con số này cũng chỉ mang tính chất tham khảo, không mang tính chất thiết yếu đối với người chơi. Việc tính toán để update lại kết quả này có thể thực hiện một lần vào cuối ngày.

    CDN – Content Delivery Network

    GenK là một trang tin điện tử chuyên về công nghệ hàng đầu Việt Nam có hàng chục triệu lượt đọc mỗi tháng từ khắp Việt Nam. Giả sử như server của GenK đặt tại Hà Nội, thì tốc độ truy cập của độc giả ở Tp.Hồ Chí Minh sẽ thấp hơn tốc độ truy cập của độc giả ở Đà Nẵng. Nói chung, càng gần nguồn phát dữ liệu thì tốc độ truy xuất dữ liệu sẽ càng nhanh. Vậy, nếu ta lưu một bản sao của GenK tại một server ở Bình Dương thì người dùng ở Tp.Hồ Chí Minh sẽ đọc GenK với tốc độ nhanh hơn nhiều. Đó chính là nguyên tắc hoạt động cơ bản của các công ty cung cấp dịch vụ CDN. Khi một người dùng sử dụng sản phẩm có load các tài nguyên từ CDN, thì dịch vụ này sẽ kiểm tra xem các request tài nguyên xuất phát từ đâu, từ đó trả về các tài nguyên được lưu trữ trong các cache server gần nhất với vị trí phát sinh các request đó.

    Nghe nhiều nhưng bạn đã hiểu về caching, một kĩ thuật phổ biến để tăng hiệu năng máy tính? - Ảnh 5.
    Tin cùng chuyên mục
    Xem theo ngày

    NỔI BẬT TRANG CHỦ