Docsity
Docsity

Prepare for your exams
Prepare for your exams

Study with the several resources on Docsity


Earn points to download
Earn points to download

Earn points by helping other students or get them with a premium plan


Guidelines and tips
Guidelines and tips

Báo cáo môn hệ điều hành, Lab Reports of Operating Systems

Báo cáo cuối kì môn hệ điều hành với hệ điều hành Linux

Typology: Lab Reports

2022/2023

Uploaded on 06/13/2023

duc-nguyen-minh-8
duc-nguyen-minh-8 🇻🇳

3 documents

1 / 43

Related documents


Partial preview of the text

Download Báo cáo môn hệ điều hành and more Lab Reports Operating Systems in PDF only on Docsity! ĐẠI HỌC BÁCH KHOA HÀ NỘI TRƯỜNG ĐIỆN - ĐIỆN TỬ BÁO CÁO BÀI TẬP LỚN MÔN HỆ ĐIỀU HÀNH Đề tài: SỬ DỤNG THUẬT TOÁN SMART SWAPPING ĐỂ NÂNG CAO HIỆU NĂNG CỦA LINUX Sinh viên thực hiện: NGUYỄN MINH ĐỨC 20192780 LÊ XUÂN HƯNG 20192892 TRẦN QUANG HUY 20192918 TRẦN HẢI DƯƠNG 20192800 Lớp: 137324 Nhóm: 5 Giảng viên hướng dẫn: TS. HÀN HUY DŨNG Hà Nội, March 30, 2023 LỜI NÓI ĐẦU Ngày nay với sự phát triển của khoa học và kĩ thuật, đã tạo ra các công nghệ mới làm cho các thiết bị phần cứng được nâng cao cả về dung lượng và hiệu năng xử lý. Tuy nhiên cùng với sự phát triển của các công nghệ phần mềm thì nhu cầu về phần cứng là không bao giờ vô hạn. Vì vậy với các máy tính có cấu hình thấp chúng ta cần tìm kiếm giải pháp cho vấn đề này. Các máy cấu hình thấp chạy trên hệ điều hành dựa trên Linux đang gặp vấn đề khi thực hiện bình thường hóa sau một nhiệm vụ nặng. Máy tính bắt đầu treo và giao diện người dùng trở nên chậm, các ứng dụng mất nhiều thời gian hơn để tải và toàn bộ hệ thống chậm lại. Quản lý bộ nhớ ảo Linux đóng một vai trò quan trọng trong việc quản lý các tác vụ chuyên sâu của bộ nhớ trên máy tính. Công nghệ máy ảo đã được sản xuất trong thời gian dài. Cho phép nhiều phiên bản hệ điều hành chia sẻ cùng một phần cứng để tăng hiệu quả sử dụng tài nguyên. Nhưng Zhuanget al. cung cấp một tập hợp các đề xuất để giải quyết các vấn đề có thể ảnh hưởng đáng kể đến hiệu suất của các ứng dụng đang chạy trong các nhóm. Cụ thể, (1) bộ nhớ không được dành riêng cho cgroups (như với các máy ảo); (2) cả bộ nhớ ẩn danh và bộ đệm trang là một phần của giới hạn bộ nhớ và cái trước có thể trục xuất cái sau; (3) hệ điều hành có thể đánh cắp bộ đệm trang từ bất kỳ cgroups nào.[1] Nakazawa et. Al đã trình bày một nghiên cứu định lượng về sự suy giảm hiệu suất của khối lượng công việc được chứa do quá mức bộ nhớ và một kỹ thuật để giảm thiểu nó. Họ tập trung vào quá mức bộ nhớ vật lý, trong đó tổng của bộ nhớ tập hợp làm việc lớn hơn bộ nhớ vật lý. Phân tích của họ cho thấy thông lượng của một container được tải rất nhiều đã giảm và đa dạng khi bộ nhớ quá mức. Lý do là tập hợp hoạt động của container được tải rất nhiều được hoán đổi sự kiện, nó truy cập bộ nhớ thường xuyên hơn so với các bộ được tải nhẹ.[2] Nakaike đã làm việc trong việc tìm kiếm nguyên nhân chính gây suy thoái hiệu suất, đó là hoạt động cải tạo cache trang, giúp trục xuất các trang bộ nhớ được truy cập thường xuyên được ánh xạ vào một tệp thay vì hoán đổi các trang ẩn danh hiếm khi được truy cập. Bài viết của họ cũng xác nhận rằng một hệ thống bộ nhớ ảo Linux có thể được tăng cường để cải thiện hiệu suất của khối lượng công việc Java nhằm đăng ký bộ nhớ thông qua một thử nghiệm buộc một số trang tệp để tồn tại trong bộ nhớ vật lý. Họ đã điều tra cách họ nên tăng cường hệ thống bộ nhớ ảo để cải thiện hiệu suất trong môi trường mã hóa bộ nhớ. Phát hiện chính của họ là việc cải tạo cache trang trên hệ thống bộ nhớ ảo Linux là nguyên nhân chính của sự suy giảm hiệu suất khi khối lượng công việc Java làm việc quá mức.[3] Hầu hết các nhà nghiên cứu có máy tính cấu hình cao bao gồm nhiều RAM hơn vì 2.5 Kết luận . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 CHƯƠNG 3. TÌM HIỂU VỀ ZSWAP 18 3.1 Giới thiệu về Zswap . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 3.2 Ý tưởng của Zswap . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.3 Source code của Zswap . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.3.1 Hàm nén và lưu trữ . . . . . . . . . . . . . . . . . . . . . . . . 19 3.3.2 Hàm giải nén và giải phóng . . . . . . . . . . . . . . . . . . . 24 3.4 Sửa đổi và rebuild zswap trong linux kernel . . . . . . . . . . . . . . . 27 3.4.1 Build config . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.4.2 Debugfs và printk . . . . . . . . . . . . . . . . . . . . . . . . . 28 3.5 Đo đạc và kết quả . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.5.1 Setup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.5.2 Tiến hành . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.5.3 Kết quả . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 KẾT LUẬN 33 Kết luận chung 33 TÀI LIỆU THAM KHẢO 34 DANH MỤC KÝ HIỆU VÀ CHỮ VIẾT TẮT LRU Least Recetly Used i DANH MỤC HÌNH VẼ Hình 2.1 Sơ đồ khối thuật toán smart swapping . . . . . . . . . . . . . . . 4 Hình 2.2 Lệnh xóa swap space mặc định . . . . . . . . . . . . . . . . . . . 5 Hình 2.3 Tạo swap space theo mong muốn . . . . . . . . . . . . . . . . . . 5 Hình 2.4 Lệnh kiểm tra lượng RAM khả dụng . . . . . . . . . . . . . . . . 5 Hình 2.5 Lệnh kiểm tra lượng Swap space bị chiếm . . . . . . . . . . . . . 6 Hình 2.6 Kiểm tra ngưỡng Swap . . . . . . . . . . . . . . . . . . . . . . . 6 Hình 2.7 Báo hiệu RAM có sẵn không đủ để thực hiện swap . . . . . . . . 6 Hình 2.8 Tiến hành quá trình Swap . . . . . . . . . . . . . . . . . . . . . 6 Hình 2.9 Kết quả các thông số theo dõi . . . . . . . . . . . . . . . . . . . 7 Hình 2.10 Kết quả đo thời gian khởi động ứng dụng Calender với TH1 . . . 9 Hình 2.11 Kết quả đo thời gian khởi động ứng dụng Calculator với TH1 . . . 9 Hình 2.12 Kết quả đo thời gian khởi động ứng dụng Files với TH1 . . . . . . 10 Hình 2.13 Kết quả đo thời gian khởi động ứng dụng Firefox với TH1 . . . . 10 Hình 2.14 Kết quả đo thời gian khởi động ứng dụng Rhythmbox với TH1 . . 11 Hình 2.15 Kết quả đo thời gian khởi động ứng dụng Calender với TH2 . . . 12 Hình 2.16 Kết quả đo thời gian khởi động ứng dụng Calculator với TH2 . . . 12 Hình 2.17 Kết quả đo thời gian khởi động ứng dụng Files với TH2 . . . . . . 13 Hình 2.18 Kết quả đo thời gian khởi động ứng dụng Firefox với TH2 . . . . 13 Hình 2.19 Kết quả đo thời gian khởi động ứng dụng Rhythmbox với TH2 . . 14 Hình 2.20 Kết quả đo thời gian khởi động ứng dụng Calender với TH3 . . . 15 Hình 2.21 Kết quả đo thời gian khởi động ứng dụng Calculator với TH3 . . . 15 Hình 2.22 Kết quả đo thời gian khởi động ứng dụng Files với TH3 . . . . . . 16 Hình 2.23 Kết quả đo thời gian khởi động ứng dụng Firefox với TH3 . . . . 16 Hình 2.24 Kết quả đo thời gian khởi động ứng dụng Rhythmbox với TH3 . . 17 Hình 3.1 Vị trí của Zswap trong hệ thống memory management . . . . . . 18 Hình 3.2 Phần trăm cpu được sử dụng trong các thử nghiệm . . . . . . . . 32 ii CHƯƠNG 1. CHƯƠNG MỞ ĐẦU 1.1 Đặt vấn đề Các máy tính yếu chạy trên hệ điều hành dựa trên Linux thường gặp sự cố khi thực hiện quá trình bình thường hóa sau một tác vụ nặng. Máy tính bắt đầu bị treo và giao diện người dùng bị lag, các ứng dụng mất nhiều thời gian hơn để tải và toàn bộ hệ thống chạy chậm lại. Linux Virtual Memory Management đóng một vai trò quan trọng trong việc quản lý các tác vụ cần nhiều bộ nhớ trên máy tính. Mà bộ nhớ Swap lại lưu trên đĩa cứng. Dẫn đến tốc độ truy cập sẽ chậm hơn nhiều so với RAM. Vì vậy ta cần làm thế nào để chúng ta phải tối ưu được bộ nhớ RAM và hạn chế phải sử dụng Swap. Bên cạnh đó, khi một ứng dụng nặng được khởi chạy và RAM bị chiếm dụng hoàn toàn, Bộ nhớ ảo (Swap space) bắt đầu đầy. Nhưng khi các ứng dụng chiếm nhiều RAM kết thúc và RAM có sẵn và đủ để chứa nội dung của bộ nhớ ảo (swap space) thì quá trình chuyển đổi ngược lại không diễn ra. Từ quá trình làm việc với các ứng dụng nặng như Android studio,... nhóm em phát hiện ra vấn đề này từ đó đã tìm hiểu về các nghiên cứu trước đó về vấn đề để thực hiện cải thiện, nấng cao hiệu năng của linux trong khi sử dụng máy tính. 1.2 Mục đích bài tập lớn Từ vấn đề nêu trên, để giải quyết các vấn đề này, nhóm đã tìm hiểu Zswap là một cách để tối ưu hóa dung lượng RAM và hạn chế được việc phải chuyển sang bộ nhớ Swap. Khi tính năng này được kích hoạt, một lượng RAM của máy chủ sẽ bị gạt sang một bên và khi hệ thống cần thêm RAM để sử dụng thì ZSWAP sẽ được sử dụng tương tự như tính năng Swap. Cơ chế sử dụng bộ nhớ sẽ ưu tiên như sau: RAM > ZSWAP > SWAP. Đồng thời nhóm cũng tái hiện lại thuật toán Smart Swapping cũng là một thuật toán giúp giải quyết vấn đề trên đã được các nhà nghiên cứu đề xuất trước đó.[4]. Trong phạm vi nghiên cứu này, bài tập lớn này sẽ tập trung vào việc tìm hiểu Zswap và nghiên cứu và xây dựng, đánh giá lại kết quả smart swapping trên các thiết bị phần cứng nhóm đã có. 1.3 Hướng phát triển đề tài Trong bài tập lớn, đã thực hiện tìm hiểu Zswap và tái hiện , đo lại kết quả và đánh giá thuật toán Smart swapping để có thể đưa ra nhưng cải tiến mới trong tương lai. 1 1.4 Kế hoạch và công việc thực hiện Bảng 1.1 Kế hoạch triển khai bài tập lớn Thời gian Công việc 24/01 – 31/01/2023 Nghiên cứu về bài báo Tìm kiếm tài liệu liên quan đến Swapping trong Linux Tìm hiểu về source của Zswap 01/02 - 07/01/2023 Tìm hiểu và viết thuật toán Smart Swapping Viết thêm vào source của zswap để in ra được các thông tin cần thất. Sau đó build lại Linux Chạy thử trên hệ điều hành Linux 08/02 - 18/02/2023 Đo đạc các thông số đã đề xuất Chạy trên nhiều loại phần cứng khác nhau 18/02 - 21/02/2023 Tổng kết và rút ra nhận xét, kết luận 2 CHƯƠNG 2. THUẬT TOÁN SMART SWAPPING [4] 2.1 Phương pháp luận thuật toán Quản lý bộ nhớ ảo của hệ điều hành dựa trên Linux đã ảnh hưởng đến sự ổn định của máy tính. Khi một ứng dụng tiêu tốn tài nguyên cần nhiều RAM hơn được chạy trên thiết bị cấp thấp, bộ nhớ chính (RAM) sẽ bị chiếm dụng hoàn toàn và bộ nhớ ảo bắt đầu bị chiếm dụng. Giao diện người dùng được chuyển sang phần Swap space trong khi ứng dụng đang được người dùng sử dụng được tải trong bộ nhớ chính (RAM). Thông qua thuật toán Smart Swapping, giao diện người dùng được giữ lại trong bộ nhớ Swap phải được phân bổ trở lại bên trong RAM mà không phá hoại tính toàn vẹn của các quy trình đang chạy trên máy. Điều này đạt được bằng cách sử dụng lệnh Linux để chuyển nội dung trên bộ nhớ Swap sang RAM. Ngoài ra, dung lượng RAM khả dụng sẽ được theo dõi để việc swap chỉ được thực hiện khi có đủ RAM khả dụng trên PC để tránh bất kỳ lỗi bất thường và hỏng dữ liệu nào. Ngoài ra, phải đặt ngưỡng dung lượng bộ nhớ Swap đã sử dụng để tránh quá trình swap không cần thiết có thể dẫn đến sự mất ổn định của hệ thống và có thể bị sập. Sau khi hoán đổi bị xóa, hệ thống sẽ ổn định và các ứng dụng hoạt động trơn tru. Ngoài ra, UI trở nên trôi chảy hơn và các chương trình mất ít thời gian hơn để khởi động. 2.2 Triển khai và cài đặt thuật toán 2.2.1 Mô tả thuật toán • Bước 1: Lưu dung lượng có sẵn của RAM vào biến R, lưu bộ nhớ swap vào biến S • Bước 2: Nếu S < Sng thì kết thúc • Bước 3:Nếu S>= Sng thì sẽ kiểm tra điều kiện R > S. Nếu đúng thì thực hiện chuyển dữ liệu từ swap space về lại RAM. Nếu sai thì kết thúc. • Bước 4: Quá trình được lặp lại sau khi hoàn tất các bước trên. 3 Hình 2.5 Lệnh kiểm tra lượng Swap space bị chiếm Tiếp theo, chúng ta sẽ kiểm tra điều kiện: S >= 100MB. Nếu không thì sẽ không có thay đổi gì và in ra dòng chữ báo hiệu. Hình 2.6 Kiểm tra ngưỡng Swap Nếu S >= 100MB, chúng ta tiếp tục kiểm tra trong RAM có sẵn lượng bộ nhớ để phục vụ cho swap trở lại không ? Nếu không đủ thì sẽ giữ nguyên và in ra dòng báo hiệu Hình 2.7 Báo hiệu RAM có sẵn không đủ để thực hiện swap Nếu đủ thì sẽ in dòng báo hiệu và tiến hành chuyển trả về RAM Hình 2.8 Tiến hành quá trình Swap Sau đó sẽ in ra các thông số như RAM khả dụng, Used/Free Swap space Và quá 6 trình này sẽ lặp lại sau 15s để dễ dạng theo dõi và đánh giá. Hình 2.9 Kết quả các thông số theo dõi Source code hoàn chỉnh thuật toán: https://github.com/minhduc01168/Smart- swapping 2.3 Phương pháp đo đạc và kiểm tra 2.3.1 Phương pháp đo Phương pháp:Thực hiện đo thời gian khởi động của các ứng dụng trong trường hợp không có sử dụng thuật toán và trường hợp có chạy smart swapping. Tiến hành so sánh để đánh giá hiệu quả của thuật toán. Công cụ đo:Application Start-up Time Measure Đây là một phần mềm tiện ích của Linux cho phép hiển thị thời gian hiển thị của một số phần mềm. Quy trình thực hiện đo: Trường hợp 1: Không dùng thuật toán Smart Swapping • Bước 1: Bật một tác vụ nặng (Firefox với nhiều tab, Android Studio,. . . .). • Bước 2: Tiến hành bật thêm các app khác để cho các app này nằm trong swap memory như VS Code, pycharm, zalo, word, excel,.... càng nhiều càng tốt để cho máy lag treo cũng được. • Bước 3: Tiến hành tắt tác vụ nặng ở bước 1. Chờ trong khoảng 10s để máy tính ổn định. • Bước 4: Tiến hành bật app cần đo time được định từ trước và đo. 7 Lưu ý: Ghi lại những ứng dụng đã bật. Trường hợp 2: Dùng thuật toán Smart Swapping • Từ Bước 1 đến Bước 3 giống bên trường hợp 1 • Bước 4: Khởi chạy thuật toán Smart Swapping • Bước 5: Tiến hành bật app cần đo time được định từ trước và đo. 2.3.2 Đánh giá Cách tiến hành lấy kết quả: Thực hiện đo 20 lần trên mỗi mỗi ứng dụng đã định trước ghi kết quả vào excel để tính trung bình thời gian giảm cho mỗi ứng dụng. Kịch bản đo: Thực hiện đo từng lần. Các ứng dụng bật ở Bước 2 của phương pháp đo là giống nhau trong mỗi lần đo. Công thức tính trung bình thời gian giảm: T = Σ(tnswap − tswap) 3 (2.1) Trong đó: • T : Thời gian giảm trung bình • tnswap: Thời gian khi không sử dụng thuật toán Smart swapping ở các lần đo • tswap: Thời gian khi sử dụng thuật toán Smart swapping ở các lần đo Công thức tính hệ số giảm: k = Σtnswap Σtswap (2.2) Trong đó: • k : Hệ số giảm • tnswap: Thời gian khi không sử dụng thuật toán Smart swapping ở các lần đo • tswap: Thời gian khi sử dụng thuật toán Smart swapping ở các lần đo 8 Thời gian giảm trung bình: T = 3398 (ms) = 3.4 (s) Hệ số giảm: k ≈ 2.3 Hình 2.14 Kết quả đo thời gian khởi động ứng dụng Rhythmbox với TH1 Thời gian giảm trung bình: T = 1224 (ms) = 1.2 (s) Hệ số giảm: k ≈ 1.73 11 2.4.2 Trường hợp 2:Tiến hành đo trên hệ thống AMD Ryzen 5 5600H CPU, 8GB RAM, 500GB Hard disk với swap space = 1 GB Hình 2.15 Kết quả đo thời gian khởi động ứng dụng Calender với TH2 Thời gian giảm trung bình: T = 83 (ms) = 0.083 (s) Hệ số giảm: k ≈ 1.38 Hình 2.16 Kết quả đo thời gian khởi động ứng dụng Calculator với TH2 12 Thời gian giảm trung bình: T = 112 (ms) = 0.11 (s) Hệ số giảm: k ≈ 1.46 Hình 2.17 Kết quả đo thời gian khởi động ứng dụng Files với TH2 Thời gian giảm trung bình: T = 28 (ms) = 0.028 (s) Hệ số giảm: k ≈ 1.26 Hình 2.18 Kết quả đo thời gian khởi động ứng dụng Firefox với TH2 13 Thời gian giảm trung bình: T = 137 (ms) = 0.137 (s) Hệ số giảm: k ≈ 1.61 Hình 2.22 Kết quả đo thời gian khởi động ứng dụng Files với TH3 Thời gian giảm trung bình: T = 27 (ms) = 0.027 (s) Hệ số giảm: k ≈ 1.24 Hình 2.23 Kết quả đo thời gian khởi động ứng dụng Firefox với TH3 16 Thời gian giảm trung bình: T = 681 (ms) = 0.681 (s) Hệ số giảm: k ≈ 1.6 Hình 2.24 Kết quả đo thời gian khởi động ứng dụng Rhythmbox với TH3 Thời gian giảm trung bình: T = 88 (ms) = 0.088 (s) Hệ số giảm: k ≈ 1.16 2.5 Kết luận Từ các kết quả đo có được từ các thiết bị khác nhau với các phần cứng khác nhau và thực hiện đo dưới các điều kiện khác nhau, ta có thể thấy thời gian để khởi động các ứng dụng khác nhau được giảm đáng kể khoảng 1.5 lần khi sử dụng smart swap script so với khi không sử dụng. Đồng thời trong tất cả các lần thử nghiệm, giao diện người dùng cũng có xu hướng hoạt động trơn tru hơn mà hơn không có hiện tượng giật, lag khi chạy smart swap script. Khi không sử dụng script thiết bị xuất hiện một vài biểu hiện giật, đơ giao diện cùng với thời gian khởi động các ứng dụng lớn. Qua các thông số đo đạc được cho thấy, triển khai thuật toán smart swap đã cải thiện hiệu suất hoạt động của hệ thống. Khi chạy smart swap script dưới nền, hệ thống hoạt động một cách trơn tru mặc dù đang có áp lực lớn lên bộ nhớ chính của hệ thống. 17 CHƯƠNG 3. TÌM HIỂU VỀ ZSWAP 3.1 Giới thiệu về Zswap Zswap là một module của linux kernel cung cấp bộ đệm nén (compressed Swap) trong RAM, có thể được sử dụng để thay thế cho Swap space truyền thống trên ổ đĩa cứng. Khi được bật, Zswap sẽ nén và lưu trữ các page ít được sử dụng gần đây nhất của bộ nhớ và nén nó trong RAM. Nếu một ứng dụng cố gắng truy cập một page đã nén ở trong bộ nhớ cache đã nén, thì page đã nén sẽ được giải nén ngay lập tức và dữ liệu không nén sẽ được trả lại cho ứng dụng. Điều này có thể giúp cải thiện hiệu suất hệ thống, vì truy cập dữ liệu từ bộ nhớ nhanh hơn truy cập dữ liệu từ Swap space truyền thống ở ổ đĩa. Hình 3.1 Vị trí của Zswap trong hệ thống memory management Zswap có thể hữu ích trong các hệ thống có dung lượng RAM hạn chế hoặc khi dung lượng trao đổi trên đĩa cứng chậm. Nó có thể giúp giảm số lượng thao tác I/O trên đĩa cứng, điều này có thể cải thiện khả năng phản hồi tổng thể của hệ thống. Zswap có sẵn trong nhiều distribution của Linux và có thể dễ dàng được bật theo mặc định hoặc được người dùng định cấu hình. Tuy nhiên, do Zswap là một module bậc thấp nên không có documment chi tiết về nó, khiến cho người dùng không hiểu được cách mà nó hoạt động. Chương này sẽ đi sâu vào code nguồn của zswap, hướng dẫn cách cài đặt, modify code nguồn cho mục đích debug và phân tích cũng như thử nghiệm thay thế các paramter chính của module trong các điều kiện về dung lượng tài nguyên bộ nhớ khác nhau. 18 Phân đoạn đầu tiên của code là kiểm tra điều kiện để kích hoạt quy trình zswap. Nếu các điều kiện sau thỏa mãn, page sẽ được nén và lưu trữ vào zpool. Nếu bất kì điều kiện nào không thỏa mãn, page sẽ được đẩy sang bộ nhớ swap trên ổ cứng Kiểm tra kích thước của Page Kiểm tra Zswap có được bật hay không và red-black tree ( cấu trúc dữ liệu của zpool) có tồn tại Kiểm tra dung lượng trống của zpool, nếu đầy hàm sẽ đặt cờ để cho biết rằng Pool đã đạt đến giới hạn và giải phóng không gian bằng cách gọi hàm Shrink. Hàm trả về với lỗi hết bộ nhớ nếu hàm Srink trả về false . Kiểm tra Pool tổng và xác định xem các page mới có thể được lưu lại không. (Zswap sử dụng nén đa luồng không đồng bộ nên cần phải double check) / * a l l o c a t e e n t r y * / e n t r y = z s w a p _ e n t r y _ c a c h e _ a l l o c (GFP_KERNEL ) ; i f ( ! e n t r y ) { z s w a p _ r e j e c t _ k m e m c a c h e _ f a i l ++; r e t = −ENOMEM; go to r e j e c t ; } i f ( z s w a p _ s a m e _ f i l l e d _ p a g e s _ e n a b l e d ) { s r c = kmap_atomic ( page ) ; i f ( z s w a p _ i s _ p a g e _ s a m e _ f i l l e d ( s r c , &v a l u e ) ) { kunmap_atomic ( s r c ) ; e n t r y −> o f f s e t = o f f s e t ; e n t r y −> l e n g t h = 0 ; e n t r y −> v a l u e = v a l u e ; a t o m i c _ i n c (& z s w a p _ s a m e _ f i l l e d _ p a g e s ) ; go to i n s e r t _ e n t r y ; } kunmap_atomic ( s r c ) ; } / * i f e n t r y i s s u c c e s s f u l l y added , i t keeps t h e r e f e r e n c e * / e n t r y −> poo l = z s w a p _ p o o l _ c u r r e n t _ g e t ( ) ; i f ( ! e n t r y −> poo l ) { r e t = −EINVAL ; 21 go to f r e e p a g e ; } Trong đoạn mã này, zswap được bộ đệm cấp phát phân vùng nhớ. Nếu cấp phát không thành công, hàm trả về lỗi. Tiếp theo nội dung của page sẽ được kiểm tra trùng lặp. Nếu page có cùng nội dung với 1 page đã có trong cây rbt, zswap sẽ gán 1 phân vùng ảo trỏ vào page có sẵn thay vì phân vùng cho page mới. Cuối cũng hàm kiểm tra lại con trỏ của phân vùng, nếu con trỏ hợp lệ thì tiếp tục. / * compress * / acomp_ctx = r a w _ c p u _ p t r ( e n t r y −>pool −>acomp_ctx ) ; mutex_ lock ( acomp_ctx −>mutex ) ; d s t = acomp_ctx −>dstmem ; s g _ i n i t _ t a b l e (& i n p u t , 1 ) ; s g _ s e t _ p a g e (& i n p u t , page , PAGE_SIZE , 0 ) ; s g _ i n i t _ o n e (& o u t p u t , d s t , PAGE_SIZE * 2 ) ; a c o m p _ r e q u e s t _ s e t _ p a r a m s ( acomp_ctx −>req , &i n p u t , &o u t p u t , PAGE_SIZE , d l e n ) ; r e t = c r y p t o _ w a i t _ r e q ( c ryp to_acomp_compress ( acomp_ctx −> r e q ) , &acomp_ctx −> w a i t ) ; d l e n = acomp_ctx −>req −> d l e n ; i f ( r e t ) { r e t = −EINVAL ; go to put_dstmem ; } Đoạn code này nén các page được đưa vào zswap. Nó thiết lập hai danh sách thu thập phân tán để nén đầu vào và chứa đầu ra đã nén. Hàm crypto-acomp-compress() nén dữ liệu đầu vào. Thuật toán dùng để nén và phương thức lưu trữ được lựa chọn được lấy từ biến toàn cục của hệ thống và lưu lại vào object acompr-ctx (compress context ). Hàm crypto-wait-req() được gọi để đợi quá trình nén hoàn tất. Nếu quá trình nén thành công, độ dài đã nén sẽ được lưu trong dlen. Nếu có lỗi, -EINVAL được trả về và thao tác bị hủy bỏ. 22 / * s t o r e * / h l e n = z p o o l _ e v i c t a b l e ( e n t r y −>pool −> z p o o l ) ? s i z e o f ( zhd r ) : 0 ; g fp = __GFP_NORETRY | __GFP_NOWARN | __GFP_KSWAPD_RECLAIM ; i f ( z p o o l _ m a l l o c _ s u p p o r t _ m o v a b l e ( e n t r y −>pool −> z p o o l ) ) g fp | = __GFP_HIGHMEM | __GFP_MOVABLE ; r e t = z p o o l _ m a l l o c ( e n t r y −>pool −> zpool , h l e n + dlen , gfp , &h a n d l e ) ; i f ( r e t == −ENOSPC) { z s w a p _ r e j e c t _ c o m p r e s s _ p o o r ++; go to put_dstmem ; } i f ( r e t ) { z s w a p _ r e j e c t _ a l l o c _ f a i l ++; go to put_dstmem ; } buf = zpoo l_map_hand le ( e n t r y −>pool −> zpool , hand le , ZPOOL_MM_WO) ; memcpy ( buf , &zhdr , h l e n ) ; memcpy ( buf + hlen , d s t , d l e n ) ; zpoo l_unmap_handle ( e n t r y −>pool −> zpool , h a n d l e ) ; mutex_unlock ( acomp_ctx −>mutex ) ; / * p o p u l a t e e n t r y * / e n t r y −> o f f s e t = o f f s e t ; e n t r y −> h a n d l e = h a n d l e ; e n t r y −> l e n g t h = d l e n ; Tính toán kích thước của dữ liệu nén sẽ được ghi vào bộ lưu trữ zswap, là tổng kích thước của header zswap (hlen) và kích thước của dữ liệu nén (dlen) Đặt cờ để phân bổ bộ nhớ cho bộ đệm dữ liệu nén (gfp) Phân bổ bộ nhớ cho bộ đệm dữ liệu đã nén bằng cách sử dụng zpoolmalloc. Nếu phân bổ không thành công do thiếu dung lượng code chuyển đến nhãn giải phóng zpool Sau khi cấp phát thành công header và dữ liệu nén được copy vào bộ đệm được phân bổ bằng hàm memcpy. Lúc này đã qua giai đoạn thao tác với bộ nhớ đã kết thúc, mutex được unlock cho các luồng nén khác thực hiện 23 s r c = tmp ; zpool_unmap_handle ( e n t r y −>pool −> zpool , e n t r y −> h a n d l e ) ; } acomp_ctx = r a w _ c p u _ p t r ( e n t r y −>pool −>acomp_ctx ) ; mutex_ lock ( acomp_ctx −>mutex ) ; s g _ i n i t _ o n e (& i n p u t , s r c , e n t r y −> l e n g t h ) ; s g _ i n i t _ t a b l e (& o u t p u t , 1 ) ; z s w a p _ d i n p u t _ l e n g t h = e n t r y −> l e n g t h ; z s w a p _ d o u t p u t _ l e n g t h = PAGE_SIZE ; s g _ s e t _ p a g e (& o u t p u t , page , PAGE_SIZE , 0 ) ; a c o m p _ r e q u e s t _ s e t _ p a r a m s ( acomp_ctx −>req , &i n p u t , &o u t p u t , e n t r y −> l e n g t h , d l e n ) ; r e t = c r y p t o _ w a i t _ r e q ( c ryp to_acomp_decompress ( acomp_ctx −> r e q ) , &acomp_ctx −> w a i t ) ; mutex_unlock ( acomp_ctx −>mutex ) ; i f ( zpoo l_can_s l eep_mapped ( e n t r y −>pool −> z p o o l ) ) zpoo l_unmap_handle ( e n t r y −>pool −> zpool , e n t r y −> h a n d l e ) ; e l s e k f r e e ( tmp ) ; BUG_ON( r e t ) ; f r e e e n t r y : s p i n _ l o c k (& t r e e −> l o c k ) ; z s w a p _ e n t r y _ p u t ( t r e e , e n t r y ) ; s p i n _ u n l o c k (& t r e e −> l o c k ) ; r e t u r n r e t ; } Đầu tiên, hàm tìm kiếm page trong cây thích hợp. Nếu không tìm thấy page, nó sẽ trả về mã lỗi cho biết không tìm thấy trang. Nếu trang được tìm thấy, chức năng tiến hành giải nén dữ liệu và ghi nó vào page đích. Hàm sử dụng một đối tượng acomp-ctx để lưu trữ trạng thái cho thuật toán giải nén, được thực hiện bằng cách gọi crypto-acomp-decompress. Dữ liệu nén được lấy từ đối tượng zpool được liên kết với mục nhập và được chuyển đến thuật toán giải nén cùng 26 với trang đích. Sau khi giải nén xong, phân vùng zpool được giải phóng, cây red-black được cập nhật kết thúc hàm 3.4 Sửa đổi và rebuild zswap trong linux kernel Vì linux kernel default của ubuntu thường đã được lược bỏ đi các phần debugger cũng như bỏ đi các compressor ít dùng đến ta phải build lại kernel để sử dụng chúng 3.4.1 Build config Để có thể sử dụng tất cả các lựa chọn của zswap, người dùng cần phải bật các parameter sau thành [y] (yes) Người dùng có thể sử dụng GUI menuconfig để thay đổi tham số hoặc chỉnh sửa trực tiếp trong file .config CONFIG_CRYPTO_DEFLATE=y CONFIG_CRYPTO_LZO=y CONFIG_CRYPTO_842=y CONFIG_CRYPTO_LZ4=y CONFIG_CRYPTO_LZ4HC=y CONFIG_CRYPTO_ZSTD=y CONFIG_FRONTSWAP=y # CONFIG_CMA i s n o t s e t CONFIG_MEM_SOFT_DIRTY=y CONFIG_ZSWAP=y # CONFIG_ZSWAP_COMPRESSOR_DEFAULT_DEFLATE i s n o t s e t CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZO=y # CONFIG_ZSWAP_COMPRESSOR_DEFAULT_842 i s n o t s e t # CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZ4 i s n o t s e t # CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZ4HC i s n o t s e t # CONFIG_ZSWAP_COMPRESSOR_DEFAULT_ZSTD i s n o t s e t CONFIG_ZSWAP_COMPRESSOR_DEFAULT=" l z o " CONFIG_ZSWAP_ZPOOL_DEFAULT_ZBUD=y # CONFIG_ZSWAP_ZPOOL_DEFAULT_Z3FOLD i s n o t s e t # CONFIG_ZSWAP_ZPOOL_DEFAULT_ZSMALLOC i s n o t s e t CONFIG_ZSWAP_ZPOOL_DEFAULT=" zbud " CONFIG_ZSWAP_DEFAULT_ON=y CONFIG_ZPOOL=y 27 CONFIG_ZBUD=y CONFIG_Z3FOLD=y CONFIG_ZSMALLOC=y CONFIG_ZSMALLOC_STAT=y Với những lựa chọn trên đã được bật, người dùng có thể chuyển qua lại giữa các hàm nén 842, lz4, lz4hc, zstd , lzo thông qua biến toàn cục hệ thống zswap.compressor và chuyển qua lại các phương thức lưu trữ zpool zbud, z3fold, zsmalloc qua biến toàn cục hệ thống zswap.zpool Để sử dụng các thư viện printk và debugfs cần phải bật 1 số parameter sau CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_CALLER i s n o t s e t # CONFIG_STACKTRACE_BUILD_ID i s n o t s e t CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 CONFIG_BOOT_PRINTK_DELAY=y CONFIG_DYNAMIC_DEBUG=y CONFIG_DYNAMIC_DEBUG_CORE=y CONFIG_SYMBOLIC_ERRNAME=y CONFIG_DEBUG_BUGVERBOSE=y 3.4.2 Debugfs và printk Với viêc thêm các template của printk như hàm pr-info() và pr-warn() vào trước các sự kiện của zswap chúng ta có được log bằng text về zswap ở trong kernel log. Ví dụ: thêm hàm pr-info để in ra kiểu zpool i f ( poo l ) { p r _ i n f o ( " l o a d e d u s i n g poo l %s /% s \ n " , pool −>tfm_name , z p o o l _ g e t _ t y p e ( pool −> z p o o l ) ) ; l i s t _ a d d (& pool −> l i s t , &zswap_poo l s ) ; z swap_has_poo l = t r u e ; } Kết quả thu được trong kernel log bằng cách chạy "sudo dmesg | grep zswap " : [ 0.501542] zswap: loaded using pool lzo/zbud 28 use s t r i c t ; use w a r n i n g s ; # S e t t h e t ime i n t e r v a l i n s e c o n d s my $ i n t e r v a l = 1 ; # Get t h e c u r r e n t t ime i n s e c o n d s my $ s t a r t t i m e = t ime ( ) ; # S t a r t r e c o r d i n g CPU s t a t s u s i n g v m s t a t open my $vmsta t , " v m s t a t $ i n t e r v a l | " o r d i e " Cannot run v m s t a t : $ ! " ; < $vmsta t > ; < $vmsta t > ; # s k i p t h e h e a d e r w h i l e (my $ l i n e = < $vmsta t >) { my @now = s p l i t ( " " , $ l i n e ) ; my $ e l a p s e d = t ime ( ) − $ s t a r t t i m e ; p r i n t f ("%d,% s \ n " , $ e l a p s e d , $now [ 1 2 ] + $now [ 1 3 ] ) ; } c l o s e $ v m s t a t ; 3.5.3 Kết quả Phần trăm cpu được sử dụng trong quá trình build được lưu lại trong 2 phút, được tính trung bình và vẽ lại trên hình 3.2. Có thể thấy compression method có làm thay đổi kết quả nhưng không đáng kể, trong khi kiểu lưu trữ dữ liệu zpool khiến cho mức độ sử dụng của cpu tăng mạnh, 15% đối với máy 1 và 20% với máy 2 31 Hình 3.2 Phần trăm cpu được sử dụng trong các thử nghiệm Độ nén của zpool ứng với các compression method cũng được lưu lại trong bảng 3.1, được tính bằng công thức compress-ratio = stored-pages *4096 / pool-total-size Có thể thấy độ nén của lz4 thấp hơn zstd nhưng hiệu suất làm việc của lz4 lại cao hơn. Điều này có thể giải thích là do tốc độ nén và giải nén của lz4 cao hơn zstd Số lượng các page bị từ chối nén trên giây cũng được lưu lai trong bảng 3.1. Số lượng page bị từ chối của z3fold cao gấp hơn 3 lần so với zbud điều này cho thấy việc lưu trữ bằng z3fold khó khăn hơn so với zbud. Bảng 3.1 Compressing ratio, page compressing reject per sec zbud z3fold zbud z3fold lzo 1.78 2.73 72 233 lz4 1.7 2.6 65 220 zstd 1.87 2.8 70 240 z842 1.6 2.5 62 210 32 KẾT LUẬN Kết luận chung Tổng kết, bài tập lớn đã cung cấp góc nhìn với tầm quan trọng của nghiên cứu và quản lý bộ nhớ trong Linux. Qua bài tập lớn nhóm cũng hiểu hơn cách triển khai, cài đặt và các tham số hệ thống của hệ điều hành Linux. Biết cách đo đạc và đưa ra các hệ số để đánh giá kết quả của các thay đổi tăng hiệu suất của hệ thống so với phiên bản cũ như thế nào. Báo cáo đã triển khai, cài đặt, đánh giá, đo dạc kết quả để chứng minh việc tăng hiệu suất của hệ thống khi sử dụng thuật toán smart swap vào hệ điều hành Linux. Đồng thời cũng đã tìm hiểu, tiến hành sửa đổi, rebuild lại zswap trong linux kernel, đo đạc và đưa ra kết quả sau khi rebuild lại. Từ các công việc trên đã thu được những kiến thức nhất định về hệ điều hành Linux và hiểu hơn về hệ thống. Để thực hiện bai tập lớn này, nhóm xin cảm ơn sự hướng dẫn của TS. Hàn Huy Dũng , bài tập lớn có thể còn nhiều thiếu sót, vì vậy nhóm kính mong thầy đưa ra nhận xét và đánh giá để đề tài được thực hiện tốt hơn. 33
Docsity logo



Copyright © 2024 Ladybird Srl - Via Leonardo da Vinci 16, 10126, Torino, Italy - VAT 10816460017 - All rights reserved