Romano Gushchin (một kỹ sư phần mềm của Facebook) đã đăng tải một loạt các bản vá cho ứng dụng phân bổ bộ nhớ của trình điều khiển slab (một bộ điều khiển bộ nhớ) trên danh sách gửi thư phát triển nhân Linux.
Điểm đáng chú ý của trình điều khiển mới này là việc chuyển việc tính toán slab từ cấp độ trang bộ nhớ lên cấp độ đối tượng kernel, cho phép chia sẻ các trang slab giữa các c-group khác nhau, thay vì phân bổ các bộ nhớ đệm slab riêng biệt cho mỗi c-group.
Roman phát hiện ra cái mà anh ta gọi là "một lỗ hổng rất nghiêm trọng" trong bộ điều khiển bộ nhớ phiến hiện có dẫn đến hiệu suất sử dụng thấp ngày nay với các nhóm.
“Lý do thực sự của thiết kế hiện tại dẫn đến việc sử dụng phiến đá thấp rất đơn giản: các trang phiến được sử dụng riêng bởi một nhóm bộ nhớ.
Nếu chỉ có một vài phân bổ có kích thước nhất định được thực hiện bởi cgroup hoặc nếu có một số đối tượng hoạt động còn lại sau khi cgroup bị loại bỏ, hoặc cgroup chứa một ứng dụng luồng đơn lẻ hầu như không cấp phát bất kỳ đối tượng hạt nhân nào, nhưng mọi lúc trên một CPU mới: trong tất cả những trường hợp này, hiệu suất sử dụng phiến kết quả là rất thấp.
Nếu tính năng kế toán kmem bị vô hiệu hóa, hạt nhân có thể sử dụng không gian trống trên các trang phiến cho các phân bổ khác. «
Bộ điều khiển bộ nhớ Slab do Romano Gushchin đề xuất năm ngoái khá hứa hẹn vì nó cho phép tăng hiệu quả sử dụng slab, giảm kích thước bộ nhớ dùng cho slab từ 30-45% và giảm đáng kể tổng mức tiêu thụ bộ nhớ của lõi.
Hơn nữa, các bản vá đã được triển khai cho thấy Facebook hiện đang sử dụng mã này trong môi trường sản xuất trên máy chủ của mình và đã tiết kiệm được khoảng 650-700MB+ cho máy chủ web giao diện người dùng , bộ nhớ đệm cơ sở dữ liệu và máy chủ DNS, cùng nhiều lợi ích khác.
Việc giảm số lượng các khối bộ nhớ không thể di chuyển cũng có tác động tích cực đến việc phân mảnh bộ nhớ. Bộ điều khiển bộ nhớ mới đơn giản hóa đáng kể mã lập trình để quản lý các khối bộ nhớ và loại bỏ nhu cầu sử dụng các thuật toán phức tạp để tạo và xóa bộ nhớ đệm khối bộ nhớ một cách động cho mỗi nhóm c.
Tất cả các cgroup cho bộ nhớ trong quá trình triển khai mới đều sử dụng một tập hợp chung các bộ đệm bản và tuổi thọ của bộ nhớ đệm bản không còn bị ràng buộc với tuổi thọ của các ràng buộc bộ nhớ được đặt thông qua cgroup.
Việc hạch toán tài nguyên chính xác hơn được triển khai trong bộ điều khiển phiến mới về mặt lý thuyết sẽ tải CPU nhiều hơn, nhưng trên thực tế, sự khác biệt hóa ra là không đáng kể.
Cụ thể, bộ điều khiển slab mới đã được sử dụng trong vài tháng trên các máy chủ thực tế của Facebook để xử lý các loại tải khác nhau, và cho đến nay vẫn chưa phát hiện thấy bất kỳ sự suy giảm đáng kể nào.
Bản vá chứa một số bộ phận bán độc lập, cũng có thể tìm thấy việc sử dụng chúng bên ngoài bộ điều khiển bộ nhớ của phiến:
- API tải trang con, có thể được sử dụng trong tương lai để đếm các đối tượng khác không phải là kích thước của trang, ví dụ: phân bổ percpu
- API mem_cgroup_ptr, nơi các con trỏ được đếm đến một bản ghi nhớ, có thể được sử dụng lại để tạo lại hiệu quả cho các đối tượng khác, ví dụ: pagecache.
Đồng thời, mức tiêu thụ bộ nhớ giảm đáng kể : trên một số máy chủ, có thể tiết kiệm tới 1 GB bộ nhớ, nhưng chỉ số này phụ thuộc rất nhiều vào bản chất của tải, tổng dung lượng RAM, công suất CPU và đặc điểm hoạt động của bộ nhớ.
Thay vì tạo một tập kmem_caches riêng biệt cho mỗi cgroup bộ nhớ, hai tập toàn cục được sử dụng: tập hợp gốc cho các phép gán cgroup chưa được đếm và nhóm gốc, và tập hợp thứ hai cho tất cả các phép gán khác. Điều này cho phép đơn giản hóa việc quản lý trọn đời các kmem_caches riêng lẻ.
Cuối cùng, nếu bạn muốn tìm hiểu về bộ 19 bản vá mới, bạn có thể tìm thấy chúng trên danh sách gửi thư của nhân hệ điều hành.