2012-08-30 49 views
7

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.

+2

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

+0

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. –

+0

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 độ). –

Trả lời

1

Điều này nghe giống như sự cố tôi đã gặp gần đây.

Nếu chương trình của bạn chấp nhận dữ liệu và đệm trong nội bộ mà không có bất kỳ giới hạn nào, thì nó có thể đọc và đệm nhanh hơn so với dữ liệu có thể xuất dữ liệu. Trong trường hợp đó, việc sử dụng bộ nhớ sẽ tiếp tục tăng mà không có giới hạn.

Các trường hợp khác của chương trình mà bạn chạy, mỗi trường hợp sẽ chậm hơn và bộ đệm càng nhanh.

Điều này có thể hoặc không có thể là vấn đề của bạn, nhưng không có thêm thông tin thì tốt nhất là tôi có thể làm.

+0

Điều này gần đúng nhất. Tôi đã giả sử để xuất dữ liệu một lần x giây (confugred bởi một tập tin cấu hình). Nhưng do lỗi mà bộ đếm đã lưu trữ thời gian chờ của tôi tăng dần khi khởi động kết hợp nên tôi đã lưu trữ một phút + dữ liệu. Thêm căng thẳng trên hệ thống gây ra lỗi tăng truy cập thời gian chờ của tôi để xảy ra thường xuyên hơn khi khởi động. Tôi muốn cảm ơn Plasma đã đề cập đến khối lượng đặt tôi đi đúng hướng. Tôi nghĩ memcheck đã nói với tôi rằng không có nhiều bộ nhớ được sử dụng vì vậy tôi đã không nhìn vào sử dụng bộ nhớ nội bộ; Tôi rõ ràng đọc nhầm memcheck. – dsollen

2

Trước tiên, bạn cần tìm kiếm sự rò rỉ mềm. Nó xảy ra khi một số tĩnh hoặc singleton dần dần tăng một số bộ đệm hoặc container và thu thập rác vào nó. Về mặt kỹ thuật nó không bị rò rỉ nhưng hiệu quả của nó là xấu.

1

Tôi có thể đề xuất bạn thử dùng MemoryScape không? Công cụ này thực hiện một công việc khá tốt trong việc phát hiện rò rỉ bộ nhớ. Nó không phải là miễn phí nhưng dành thời gian và năng lượng đã dành, nó là giá trị cố gắng.

Các vấn đề liên quan