PDA

View Full Version : Giải thích linux laptop tốn quá nhiều ram


phulerock
09-03-2008, 12:9 09-03-2008
Thư gửi
From PhuLeRock
Thư gửi LinhTT Security team

Hello Linh, sau khi tôi và Linh với Tuấn Cổ gặp một vấn đề bí ẩn về sự ngốn RAM của Ubuntu trên laptop của tôi và Tuấn Cổ, nhưng laptop vẫn chạy rất nhanh và rất ít toả nhiệt (có tải lẫn không tải). Bây giờ tôi mới có thời gian tìm hiều giải đáp điều này, thật ra trên thế giới không ai thắc mắc chuyện này vì họ đã cố ý làm vậy, và đã làm từ lâu cho Linux, và có lẽ đây là điều làm Linux Desktop của chúng ta chạy nhanh hơn so với Windows App ở một số ứng dụng tải cao như biên tập âm thanh và ảnh (mà tôi đã test khi biên tập 1 lúc mấy chục ảnh phân giải cao khi đi Đà Lạt với bạn về.)

Lý thuyết từ mailing list cùa freeBSD
http://lists.freebsd.org/pipermail/freebsd-current/2005-February/046629.html
Như sau: nếu dùng lệnh top hoặc lệnh free -m của Linux, ta dễ dành nhầm lẫn lượng memory system đang dùng cho running process. Thật ra, total phisycal memory (không tính swap on disk) được Linux tính bằng active mem + inact mem.
Đặc biệt về inact mem, là vùng nhớ khi ta run 1 process và tắt đi, system sẽ cache lại vùng nhớ này để khi gọi lại process này lần nữa, nó sẽ sử dụng vùng nhớ inact này lập tức thay vì phải cấp phát lại. Nên khi ta mở càng nhiều process, sau đó tắt đi, hiện tượng là ở chế độ không tải, memory chiếm rất nhiều.

Thực tiễn:
Vậy, câu hỏi là nếu inact mem + act mem chiếm gần hết memory, khi ta mở thêm process thì system có crash ? Linux có giải phóng inact mem không cần thiết cho process mới ?
=>> không ! vẫn chạy rất nhanh.

Lab:
Thực nghiệm trên máy 2gb ram, máy sẽ tốn rất nhiều inact mem khi bạn sử dụng nhiều chuơng trình rồi tắt đi. bình thường tổng ram lúc nào cũng khoảng 800-1GB ram. bạn dùng lệnh vmstat -S m -s sẽ thấy inact mem chiếm khoảng 700m. Lúc này laptop vẫn rất nhanh.

Tôi bật vmware với tổng ram của các guest OS là 1600 M, dùng lệnh watch -n 0.5 vmstat -S m -s sẽ thấy inact mem sẽ không thay đổi cho đến khi tổng mem lên đến 2000 m, sau đó act mem sẽ liên tục tăng và inact mem sẽ liên tục giảm, đổng thời swap disk sẽ được đem ra khoảng 100 m sử dụng.

Kết luận: kernel linux dùng inact mem để cache, vì vậy nếu sự dụng lại tiến trình cũ thì system sẽ load rất nhanh, nếu lượng mem cho process cần chạy quá lớn, system tự động đem inact mem vào swap và dành toàn bộ memory cho act mem.

Sau khi test overload thế này, tôi tắt vmware đi, kiểm tra lại:
Hiện tại hệ thống dùng: open office, firefox mở 5 tabs, pidgin chat, 2 cửa sổ nautilus, 1 terminal console
root@ubuntu-laptop:~# vmstat -S m -s

2124 m total memory

300 m used memory

159 m active memory

93 m inactive memory

1823 m free memory

11 m buffer memory

121 m swap cache

1003 m total swap

193 m used swap

809 m free swap


Thực chất running process chỉ lấy 159m ram, còn lại những “kí ức” gồm 93m inact mem và hơn 100m swap. Các kí ức "quá cũ" khác đã bị clear mất.

Vậy, kernel linux sử dụng tối đa memory để tăng tốc cho hệ thống, cache tất cả các event của process cũ trên memory chứ không phải trên swap, để phản ứng nhanh nhất với những tiến trình được gọi lại. Chỉ có những process được cache quá lâu sẽ được đưa vào swap. Điều này giải thích Linux ít hao pin laptop trong môi trường tải nặng hơn là Windows Xp vì sử dụng tối đa memory thay vì đĩa cứng.