Tôi có một chương trình chấp nhận dữ liệu từ một ổ cắm, thực hiện kiểm soát chất lượng và các loại điều hòa khác với nó, sau đó ghi nó ra một đường ống có tên. Tôi chạy valgrind trên nó và cố định tất cả các rò rỉ bộ nhớ mà ban đầu tồn tại. Sau đó tôi tạo ra một môi trường 'demo' trên một hệ thống mà tôi đã có 32 trường hợp của chương trình này đang chạy, mỗi trường hợp được cung cấp dữ liệu duy nhất và mỗi lần xuất ra đường ống riêng của nó. Chúng tôi đã thử nghiệm nó và mọi thứ đều ổn. Sau đó, tôi đã cố gắng thử nghiệm nó bằng cách tăng tốc độ dữ liệu được gửi đến một tỷ lệ vô lý và mọi thứ có vẻ tốt lúc đầu ... nhưng chương trình của tôi tiếp tục tiêu tốn nhiều bộ nhớ hơn cho đến khi tôi không còn tài nguyên.làm thế nào để săn lùng bộ nhớ bị rò rỉ valgrind nói không tồn tại?
Tôi chuyển sang valgrind và chạy cùng một thiết lập chính xác trừ khi mỗi chương trình chạy bên trong valgrind sử dụng kiểm tra rò rỉ = đầy đủ. Một vài điều kỳ lạ đã xảy ra. Đầu tiên, bộ nhớ đã bị rò rỉ, nhưng chỉ đến mức mà mỗi chương trình đã tiêu thụ .9% bộ nhớ của tôi (trước đây là bộ nhớ lớn nhất có một bộ nhớ đầy đủ 6% bộ nhớ của tôi). Với valgrind chạy chi phí CPU của các chương trình được kích hoạt và bây giờ tôi đã ở mức 100% cpu với mức tải trung bình rất lớn, vì vậy có thể thiếu CPU sẵn có khiến các chương trình chạy chậm đến mức rò rỉ mất quá nhiều thời gian để biểu lộ . Khi tôi thử dừng các chương trình này, valgrind không cho thấy rò rỉ bộ nhớ trực tiếp, nó cho thấy một số rò rỉ bộ nhớ tiềm ẩn nhưng tôi đã kiểm tra chúng và tôi không nghĩ rằng bất kỳ bộ nhớ nào trong số đó thể hiện rò rỉ bộ nhớ thực; và bên cạnh đó sự rò rỉ bộ nhớ có thể chỉ cho thấy là một vài kilobyte trong khi chương trình đã tiêu thụ hơn 100 MB. Bộ nhớ có thể truy cập (không bị rò rỉ) được báo cáo bởi valgrind cũng nằm trong phạm vi KB, vì vậy valgrind dường như tin rằng các chương trình của tôi đang tiêu tốn một phần nhỏ bộ nhớ mà Top cho biết họ đang sử dụng.
Tôi đã chạy một vài thử nghiệm khác và có kết quả kỳ lạ. Một chương trình duy nhất, thậm chí chạy ở tốc độ gấp ba lần mức rò rỉ bộ nhớ ban đầu của tôi đã được phát hiện, dường như không tiêu thụ nhiều hơn .9% bộ nhớ, hai chương trình bị rò rỉ lên tới 1.9 và 1.3% bộ nhớ tương ứng nhưng không còn nữa, lượng bộ nhớ bị rò rỉ và tốc độ rò rỉ bộ nhớ, bằng cách nào đó phụ thuộc vào số lượng phiên bản chương trình của tôi đang chạy cùng một lúc; mà không có ý nghĩa, mỗi trường hợp phải là 100% độc lập với những người khác.
Tôi cũng tìm thấy nếu tôi chạy 32 trường hợp với chỉ một trường hợp chạy trong valgrind dụ valgrinded (đó là một từ nếu tôi nói nó!) Rò rỉ bộ nhớ, nhưng với tốc độ chậm hơn so với những người chạy bên ngoài valgrind. Ví dụ valgrind sẽ vẫn nói rằng tôi không có rò rỉ trực tiếp và báo cáo tiêu thụ bộ nhớ ít hơn nhiều so với Top shows.
Tôi khá bối rối về những gì có thể gây ra kết quả này và tại sao valgrind từ chối nhận thức được rò rỉ bộ nhớ. Tôi nghĩ rằng nó có thể là một thư viện bên ngoài, nhưng tôi không thực sự sử dụng bất kỳ thư viện bên ngoài nào; chỉ các hàm/đối tượng C++ cơ bản. Tôi cũng coi nó có thể là dữ liệu được viết vào đường ống đầu ra nhanh chóng khiến bộ đệm phát triển vô thời hạn, nhưng 1) nên có giới hạn trên mà bộ đệm đó có thể phát triển và 2) khi bộ nhớ bị rò rỉ nếu tôi xóa dữ liệu tốc độ đầu vào không có gì bộ nhớ vẫn được tiêu thụ thay vì sau đó từ từ giảm trở lại một số tiền hợp lý.
Có ai cho tôi gợi ý về nơi tôi nên nhìn từ đây không? Tôi hoàn toàn bối rối về lý do tại sao bộ nhớ hoạt động theo cách này.
Cảm ơn.
Bạn có chắc chắn rằng nó bị rò rỉ và không chỉ là một phần của bộ nhớ lập trình của bạn? bạn đã thử massif chưa? – PlasmaHH
Tôi đã gặp vấn đề tương tự bản thân mình (mặc dù không phải là kỳ quặc) và tôi rất quan tâm đến bất kỳ phản hồi nào bạn nhận được. Một gợi ý: bạn có thể làm rõ hệ điều hành/phiên bản bạn đang sử dụng không? Tôi cho rằng đó là một Linux dist. –
Valgrind chạy chương trình của bạn trong hộp cát và thực hiện một số lượng lớn chế biến. Bạn nên mong đợi nó có mức sử dụng CPU cao hơn nhiều và hiệu suất chậm hơn nhiều so với cùng một ứng dụng chạy ra khỏi valgrind. Tôi sẽ xem xét liệu trong khi kiểm tra căng thẳng chương trình tạo thêm bộ đệm để giữ dữ liệu mà không thể làm cho nó vào đường ống và đang phát triển (không bị rò rỉ, chỉ phát triển khi bạn không thể giữ tốc độ). –