Có nhiều nguyên nhân gây rò rỉ bộ nhớ trên Ubuntu, nhưng may mắn là dễ nhận ra khi xảy ra. Code lỗi thường là nguyên nhân chính, vì lập trình viên có thể không kiểm tra việc giải phóng bộ nhớ không còn cần thiết. Nếu bạn cài gói unstable hoặc compile code từ nguồn, có thể gặp rò rỉ bộ nhớ vì lý do này. Bạn sẽ nhận ra khi ứng dụng báo "out of memory" dù RAM vật lý vẫn dư thừa.
Nếu lo ngại rò rỉ bộ nhớ, thử gõ free liên tục vào terminal. Nếu thấy RAM dùng tăng nhanh bất thường, bạn đã phát hiện rò rỉ. Nếu nhận lỗi bash: Not enough Memory khi chỉ mở terminal hoặc virtual console, bạn gần như chắc chắn gặp rò rỉ. Một số rò rỉ tinh vi hơn, nhưng Ubuntu và các biến thể có công cụ/gói giúp phát hiện.
Phát hiện rò rỉ bộ nhớ trên Ubuntu
Vì công cụ phát hiện rò rỉ chủ yếu dựa trên CLI, không quan trọng bạn chạy Ubuntu phiên bản nào. Chúng hoạt động tốt trong terminal Unity (Ubuntu thường), virtual console (Ubuntu Server), lxterm (Lubuntu), Konsole (Kubuntu), hoặc Xfce (Xubuntu). Thử sudo -s và nhập mật khẩu để bắt đầu.
Điều này cho shell root nếu đúng, nhưng có thể gây lỗi bộ nhớ nếu rò rỉ đã quá nghiêm trọng. Nếu truy cập được shell root, thử echo 3 > /proc/sys/vm/drop_caches, nhấn Enter, rồi exit. Chạy lại free hoặc free -m xem có giúp giải phóng bộ nhớ không.
Một số lập trình viên cho rằng không cần ép Kernel xóa cache, vì chúng nên được flush và lấy lại ngay khi cần RAM thêm. Tuy nhiên, ép xóa cache sẽ làm giảm hiệu năng, nhớ đây chỉ là test. Sau khi reboot, Kernel sẽ xây dựng lại cache như cũ.
Một số người đề xuất thêm dòng sync; sudo echo 3 > /proc/sys/vm/drop_caches vào script cron chạy định kỳ, nhưng điều này phá vỡ mục đích cache bộ nhớ. RAM rảnh chỉ là RAM không dùng, nghĩa là dữ liệu phải nạp từ thiết bị lưu trữ chậm hơn (điện cơ hoặc NAND). Dù thiết bị nào nhanh, cũng không bằng RAM. Vì vậy, hãy sửa rò rỉ bộ nhớ, nhưng đừng can thiệp hệ thống cache khi đã tối ưu.
Nếu xác định có rò rỉ bộ nhớ nhất quán xảy ra định kỳ và không thu hẹp được cụ thể, nhưng vẫn có truy cập CLI, thử chạy top. Lệnh này liệt kê tiến trình đang chạy.
Nếu Ubuntu báo lỗi lạ về top, thử busybox top để dùng phiên bản đơn giản hơn. Khi có danh sách, xem cột %MEM hoặc tương tự để xem ứng dụng nào được cấp nhiều bộ nhớ nhất. Bạn có thể ghi PID và dùng kill để đóng ứng dụng, nhưng bộ nhớ có thể vẫn không giải phóng sau đó, tuy nhiên đáng thử.
Nếu tìm thấy ứng dụng dùng nhiều bộ nhớ, nhấn q để thoát, rồi kill #### với số PID từ màn hình trước. Không kill tiến trình hệ thống hay ứng dụng có công việc chưa lưu. Tương tự như kill qua Ctrl+Alt+Del task list.
Khi tìm thấy chương trình gây rò rỉ nhất quán, bạn có thể cấu hình nó để ngăn chặn hành vi này sau này. Mỗi chương trình cần giải pháp khác nhau, vượt ra khỏi việc chỉ phát hiện rò rỉ.
Nếu bạn không chỉ troubleshoot ứng dụng mà còn làm việc với code, có thêm một số lựa chọn. Ubuntu và các biến thể cung cấp các routine C: membarrier, memusage, memusagestat.
Dùng man membarrier, man memusage, man memusagestat để xem trang manual lập trình viên Linux về các routine quan trọng này. Nếu có nâng cấp trong thư viện tương lai khi Ubuntu ra phiên bản mới, thay đổi sẽ được nêu ở đây.
Nếu cần nội dung đồ họa, memusagestat còn cho lưu biểu diễn đồ họa sử dụng bộ nhớ ra file PNG. Điều này hấp dẫn cho tác giả tiện ích, có thể dùng tạo ứng dụng kiểm tra rò rỉ bộ nhớ định kỳ.
Bạn cũng có thể cài memprof, công cụ phân tích sử dụng bộ nhớ giúp tìm rò rỉ. Nó tạo hồ sơ về lượng bộ nhớ mỗi hàm trong chương trình bạn viết cấp phát. Nó cũng quét bộ nhớ hiện có tìm các block đã cấp phát nhưng không còn tham chiếu thật. Nó làm vậy bằng cách pre-load thư viện để ghi đè tính năng cấp phát bộ nhớ của thư viện C chuẩn.
Nếu dùng công cụ này, hãy chắc chắn xóa dòng include memprof đầu code trước khi phát hành. Dòng này dùng để đảm bảo không rò rỉ, nhưng không nên thành dependency nếu bạn đóng gói code và phát hành lên kho.
VỀ TÁC GIẢ

Kevin Arrows
Kevin Arrows là chuyên gia công nghệ giàu kinh nghiệm với hơn một thập kỷ trong ngành. Anh持有 chứng chỉ Microsoft Certified Technology Specialist (MCTS) và đam mê cập nhật các phát triển công nghệ mới nhất. Kevin đã viết nhiều về các chủ đề công nghệ, thể hiện chuyên môn trong phát triển phần mềm, an ninh mạng và điện toán đám mây. Đóng góp của anh được công nhận rộng rãi và được đồng nghiệp tôn trọng, đặc biệt là khả năng giải thích các khái niệm kỹ thuật phức tạp một cách rõ ràng, súc tích.