Có một số lý do khiến rò rỉ bộ nhớ có thể xảy ra trên Ubuntu, nhưng may mắn thay, thời điểm chúng xảy ra là điều hiển nhiên. Mã lỗi thường là lý do lớn nhất, vì các lập trình viên có thể không có cơ hội kiểm tra để đảm bảo rằng bộ nhớ không còn cần thiết sẽ được giải phóng. Nếu bạn đang cài đặt các gói không ổn định hoặc biên dịch mã từ nguồn thì bạn có thể đang gặp phải vấn đề rò rỉ bộ nhớ vì lý do này. Bạn có thể sẽ bắt đầu nhận thấy chúng vì các gói ứng dụng phần mềm bắt đầu phàn nàn về việc hết bộ nhớ khi bạn cài đặt quá nhiều RAM vật lý.
Nếu bạn lo ngại về việc rò rỉ bộ nhớ, hãy thử gõ free nhiều lần vào terminal. Nếu bạn đột nhiên thấy mức sử dụng RAM tăng nhanh thì bạn đã phát hiện ra rò rỉ bộ nhớ. Nếu bạn gặp lỗi đọc nội dung như bash:Không đủ bộ nhớ khi thực hiện việc này và bạn không có gì ngoài thiết bị đầu cuối hoặc thậm chí chỉ là một bảng điều khiển ảo đang mở, thì bạn gần như chắc chắn đang xử lý một lỗi. Một số rò rỉ bộ nhớ có thể tinh vi hơn một chút, nhưng Ubuntu và các gói và công cụ tính năng phụ khác của nó có thể giúp bạn phát hiện những lỗi này.
Phát hiện rò rỉ bộ nhớ trong Ubuntu
Vì các công cụ được sử dụng để phát hiện rò rỉ bộ nhớ chủ yếu dựa trên dấu nhắc CLI nên việc bạn chạy chúng trên phiên bản Ubuntu nào không quan trọng. Chúng sẽ hoạt động tốt bên trong thiết bị đầu cuối Unity trong Ubuntu thông thường, từ bảng điều khiển ảo trong Ubuntu Server, từ lxterm trong Lubuntu, Konsole trong Kubuntu hoặc thậm chí bên trong Xfce trong Xubfox. Hãy thử thực hiện một tác vụ đơn giản như sudo -s và nhập mật khẩu của bạn để bắt đầu.
Điều này sẽ giúp bạn có được shell gốc nếu được thực hiện đúng cách, nhưng có thể gây ra lỗi bộ nhớ nếu bạn đang xử lý một rò rỉ đã đi quá xa. Nếu bạn thực sự có thể truy cập shell gốc, hãy thử gõ echo 3> /proc/sys/m/drop_caches, nhấn phím enter rồi gõ exit. Hãy thử chạy free hoặc free -m lần nữa để xem điều đó có giúp giải phóng bộ nhớ không.
Một số lập trình viên lập luận rằng không có ích gì khi buộc Kernel loại bỏ bộ nhớ đệm của nó, vì chúng cần được xóa sạch và do đó được lấy lại ngay khi cần thêm bộ nhớ vật lý. Tuy nhiên, mặc dù việc buộc xóa các bộ nhớ đệm này sẽ ảnh hưởng đến hiệu suất hệ thống nhưng hãy nhớ rằng đây chỉ là một cuộc thử nghiệm. Sau khi bạn khởi động lại hệ thống, Nhân Linux sẽ một lần nữa tập hợp các bộ nhớ đệm theo cách ban đầu.
Một số người đã đề xuất thêm tính năng đồng bộ hóa dòng; sudo echo 3> /proc/sys/vm/drop_caches thành tập lệnh cron chạy ổn định, nhưng điều này ngay từ đầu đã làm mất đi mục đích của bộ nhớ đệm. Bản thân bộ nhớ trống chỉ đơn thuần là RAM không được sử dụng và điều đó có nghĩa là dữ liệu phải được tải từ các thiết bị lưu trữ cơ điện hoặc NAND chậm hơn nhiều. Cho dù các thiết bị này có nhanh đến đâu thì chúng cũng không nhanh bằng RAM, điều đó có nghĩa là mặc dù bạn nên khắc phục tình trạng rò rỉ bộ nhớ nhưng thực tế bạn không nên can thiệp vào hệ thống bộ nhớ đệm sau khi đã đặt nó ở chế độ cài đặt tối ưu.
Nếu bạn đã quyết định rằng mình thực sự bị rò rỉ bộ nhớ nhất quán xảy ra định kỳ trong khi sử dụng máy của mình và nó không thể thu hẹp cụ thể nhưng bạn vẫn có quyền truy cập CLI, thì hãy thử chạy lệnh trên cùng. Điều này sẽ cung cấp cho bạn danh sách các tiến trình đang chạy.
Nếu Ubuntu cung cấp cho bạn một lỗi bất thường về top thì hãy thử phát hành busybox top để truy cập phiên bản thậm chí còn đơn giản hơn của chương trình này. Khi bạn có danh sách, hãy nhìn vào cột %MEM hoặc cột tương tự để xem ứng dụng nào được gán nhiều bộ nhớ nhất. Mặc dù bạn có thể ghi lại PID và đưa ra lệnh tiêu diệt số lượng chính xác của PID, nhưng điều này sẽ chỉ buộc ứng dụng đóng lại. Bộ nhớ họ sử dụng có thể vẫn không được giải phóng sau khi bạn thực hiện việc này, mặc dù điều đó tất nhiên là đáng để thử.
Nếu bạn tìm thấy một ứng dụng đang sử dụng nhiều bộ nhớ, hãy nhấn q để thoát rồi thử tắt #### bằng số PID từ màn hình trước đó. Các quy trình hệ thống không nên bị hủy theo cách này và bất kỳ thứ gì mà bạn chưa lưu cũng không được hoạt động. Hãy nghĩ về điều này tương tự như việc hủy một cái gì đó bằng danh sách tác vụ Ctrl+Alt+Del mà bạn cũng có thể sử dụng cho cùng một quy trình này.
Khi bạn tìm thấy một chương trình thường xuyên xảy ra hiện tượng này thì bạn có thể định cấu hình chương trình đó để ngăn chặn hành vi này trong tương lai. Tất nhiên, mỗi chương trình riêng lẻ sẽ cần một cách truy xuất khác nhau, điều này nằm ngoài nhiệm vụ chỉ phát hiện rò rỉ bộ nhớ.
Nếu bạn không chỉ xử lý sự cố ứng dụng mà còn thực sự làm việc với mã thì bạn có một số cách khác. Ubuntu và các phiên bản phái sinh của nó cung cấp cho bạn các quy trình C membarrier, memusage và memusagestat để lập trình.
Chỉ cần sử dụng man membarrier, man memusage hoặc man memusagestat để xem các trang Hướng dẫn lập trình viên Linux về các quy trình quan trọng này. Nếu có các bản nâng cấp trong các phiên bản tương lai của thư viện khi có phiên bản Ubuntu mới xuất hiện thì những thay đổi đó sẽ luôn được nêu ở đây.
Nếu bạn cần nội dung đồ họa thì memusagestat thậm chí còn cung cấp tùy chọn lưu biểu diễn đồ họa về việc sử dụng bộ nhớ vào tệp PNG. Điều này làm cho nó trở thành một tính năng hấp dẫn đối với các tác giả của tiện ích vì nó có thể được sử dụng để tạo các ứng dụng thường xuyên kiểm tra rò rỉ bộ nhớ.
Bạn cũng có thể muốn cài đặt memprof, đây là một công cụ lập hồ sơ sử dụng bộ nhớ nhằm hỗ trợ bạn tìm ra rò rỉ bộ nhớ. Nó tạo ra một hồ sơ liên quan đến lượng bộ nhớ mà mỗi chức năng trong chương trình bạn đang phân bổ. Nó cũng có thể quét bộ nhớ hiện có để tìm các khối đã được phân bổ nhưng không còn có các tham chiếu chính hãng. Nó thực hiện điều này bằng cách tải trước một thư viện để ghi đè các tính năng phân bổ bộ nhớ của thư viện C tiêu chuẩn.
Nếu bạn dự định sử dụng tính năng này thì hãy đảm bảo xóa dòng include memprof ở đầu mã trước khi phát hành. Điều này được sử dụng để đảm bảo bạn không bị rò rỉ, nhưng nó sẽ không trở thành phần phụ thuộc nếu bạn đóng gói mã của mình và phát hành mã đó trong kho lưu trữ.
GIỚI THIỆU TÁC GIẢ
Mũi tên Kevin
Kevin Arrows là một chuyên gia công nghệ giàu kinh nghiệm và hiểu biết với hơn một thập kỷ kinh nghiệm trong ngành. Anh có chứng chỉ Chuyên gia Công nghệ được Chứng nhận của Microsoft (MCTS) và có niềm đam mê sâu sắc trong việc cập nhật những phát triển công nghệ mới nhất. Kevin đã viết nhiều về nhiều chủ đề liên quan đến công nghệ, thể hiện chuyên môn và kiến thức của mình trong các lĩnh vực như phát triển phần mềm, an ninh mạng và điện toán đám mây. Những đóng góp của ông cho lĩnh vực công nghệ đã được các đồng nghiệp công nhận và tôn trọng rộng rãi, đồng thời ông được đánh giá cao nhờ 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 và ngắn gọn.