Cách phát hiện rò rỉ bộ nhớ trong Ubuntu



Hãy Thử Công Cụ CủA Chúng Tôi Để LoạI Bỏ Các VấN Đề

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, có thể thấy rõ khi nào chúng xảy ra. 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 đượ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ể gặp phải tình trạng rò rỉ bộ nhớ vì lý do này. Có thể bạn 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á đủ RAM vật lý.



Nếu bạn lo lắng về việc rò rỉ bộ nhớ, hãy thử gõ liên tục vào một thiết bị đầu cuối. Nếu bạn đột nhiên bắt đầu thấy việc sử dụng RAM tăng nhanh, thì bạn đã phát hiện thấy rò rỉ bộ nhớ. Nếu bạn nhận được lỗi đọc nội dung như bash: Không đủ Bộ nhớ trong khi thực hiện việc này và bạn không có gì ngoài một 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ư không nghi ngờ gì khi phải xử lý một lỗi. Một số rò rỉ bộ nhớ có thể phức tạp hơn một chút, nhưng Ubuntu và nó là các gói và công cụ tính năng bổ sung khác nhau 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 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 Xubuntu. 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 một trình bao 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 làm việc với một rò rỉ đã đi quá xa. Nếu bạn thực sự có thể truy cập trình bao gốc, hãy thử nhập echo 3> / proc / sys / m / drop_caches, nhấn phím enter rồi nhập exit. Thử chạy lại rảnh hoặc rảnh -m để xem điều đó 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ó ích gì khi buộc Kernel phải loại bỏ bộ nhớ đệm của nó, vì chúng nên được xóa và do đó được khôi phục ngay khi cần thêm bộ nhớ vật lý. Tuy nhiên, trong khi lực xả các bộ nhớ đệm này sẽ ảnh hưởng đến hiệu suất của hệ thống, hãy nhớ rằng đây chỉ là một bài kiểm tra. 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 mà chúng ở nơi đầu tiên.

Một vài người đã đề xuất thêm đồng bộ hóa dòng; sudo echo 3> / proc / sys / vm / drop_caches đến một tập lệnh cron chạy nhất quán, nhưng điều này đã đánh bại mục đích của bộ nhớ đệm ngay từ đầu. Bản thân bộ nhớ trống chỉ là RAM không sử dụng và điều đó có nghĩa là dữ liệu phải được tải từ tốc độ chậm hơn nhiềucơ điện hoặc các thiết bị lưu trữ NAND. Cho dù các thiết bị này có tốc độ nhanh như thế nào, chúng cũng không nhanh bằng RAM, điều đó có nghĩa là trong khi sửa lỗi rò rỉ bộ nhớ, bạn không nên thực sự can thiệp vào hệ thống bộ nhớ cache khi đã đặt nó ở cài đặt tối ưu.



Nếu bạn đã quyết định rằng bạn thực sự có một rò rỉ bộ nhớ nhất quán xảy ra định kỳ trong khi sử dụng máy của bạn 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 một danh sách các quy trình đang chạy.

Nếu Ubuntu cung cấp cho bạn một lỗi bất thường về đầu thì hãy thử phát hành đầu trang bận rộn thay thế để 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. Sau khi bạn có danh sách, hãy xem 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 chú PID và đưa ra lệnh hủy đối với số lượng chính xác của PID, điều này sẽ chỉ buộc ứng dụng đóng lại. Bộ nhớ mà chúng sử dụng có thể vẫn không được giải phóng sau khi bạn làm điều này, mặc dù tất nhiên nó đá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 và sau đó thử hủy #### bằng số PID từ màn hình trước. Các quy trình hệ thống không nên bị giết theo cách này, cũng như bất kỳ thứ gì bạn chưa lưu cũng không hoạt động. Hãy nghĩ điều này tương tự như việc giết thứ gì đó bằng danh sách tác vụ Ctrl + Alt + Del, bạn cũng có thể sử dụng danh sách này cho cùng quy trình này.

Khi bạn đã tìm thấy một chương trình mà điều này thường xuyên xảy ra, thì bạn có thể định cấu hình chương trình đó để ngăn chặn hành vi đó trong tương lai. Tất nhiên, mỗi chương trình riêng lẻ sẽ cần một truy xuất khác nhau, không chỉ đơn thuần là phát hiện rò rỉ bộ nhớ.

Nếu bạn không chỉ đơn thuần là khắc phục sự cố các ứng dụng, mà còn thực sự làm việc với mã thì bạn có một số tài nguyên khác. Ubuntu và các dẫn xuất của nó cung cấp cho bạn các thủ tục membarrier, memusage và memusagestat C để 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ề những quy trình quan trọng này. Nếu có các nâng cấp trong các phiên bản thư viện trong tương lai khi phiên bản Ubuntu mới ra mắt, thì các 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 của 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 các 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ụ để định hình việc sử dụng bộ nhớ nhằm hỗ trợ bạn trong việc tìm kiếm rò rỉ bộ nhớ. Nó tạo ra một cấu hình liên quan đến lượng bộ nhớ mà mỗi chức năng trong chương trình bạn đang viết phân bổ. Nó cũng có thể quét bộ nhớ hiện có để tìm các khối đã được cấp phát, nhưng không còn tính năng 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 cấp phát bộ nhớ của thư viện C tiêu chuẩn.

Nếu bạn định sử dụng điều này, hãy đảm bảo xóa dòng bao gồm memprof khỏi đầu mã của bạn trước khi phát hành. Điều này được sử dụng để đảm bảo bạn không có rò rỉ, nhưng nó sẽ không trở thành yếu tố phụ thuộc nếu bạn đóng gói mã của mình và phát hành nó trong một kho lưu trữ.

4 phút đọc