2012-11-28 22 views
8

Tôi đang làm việc trên một ứng dụng tự dồn lên đến 8 lần cho tính song song. Mỗi ngã ba có một bản sao đầy đủ của không gian bộ nhớ từ quá trình ban đầu tại thời điểm ngã ba. Dĩa nhanh chóng vì Linux chia sẻ các trang giữa các quy trình và chỉ tạo các trang mới khi chúng được sửa đổi. Sự tăng trưởng về tiêu thụ bộ nhớ, trong thực tế, có vẻ là khoảng 3x cho ứng dụng của tôi. Bất kỳ đề xuất nào về công cụ hoặc kỹ thuật để sử dụng trong việc xác định những thay đổi sẽ làm giảm sự tăng trưởng đó?Làm thế nào để giảm thiểu mức tiêu thụ bộ nhớ của chương trình C++ bằng cách sử dụng copy-on-write?

Một ý nghĩ là xem xét phân mảnh trang của các trang đã sửa đổi. Ngoài ra còn có kiểm tra sức mạnh vũ phu của những gì được phân bổ trong các quá trình chia hai. Trong cả hai trường hợp, bạn có thể giới thiệu kỹ thuật hoặc công cụ nào để thực hiện phân tích đó?

Hãy nhớ rằng chương trình mất vài giờ để hoàn thành ngay cả với tính song song và có dung lượng bộ nhớ lên đến 1 TB để tùy chọn thiết bị bị giới hạn.

+4

Bạn có cần ngã ba không? Bạn cũng có thể chỉ tạo các chủ đề khác nhau cho song song, và tất cả sẽ chia sẻ cùng một bộ nhớ (với tất cả các hàm ý) –

+1

Một gợi ý rất chung chung, nhưng bạn có thể thử sử dụng các trình phân bổ pool (hoặc tương tự) để tách bộ nhớ mà bạn sẽ viết trong nhiều quá trình, từ bộ nhớ vẫn không đổi sau khi các nhánh đã xảy ra. Vì COW được thực hiện một trang bộ nhớ tại một thời điểm, mọi bộ nhớ chỉ đọc được trộn lẫn với bộ nhớ mà bạn sửa đổi kết quả trong quá trình sao chép không cần thiết. Vì nó không quan trọng để tránh sửa đổi bộ nhớ từ phân bổ chỉ đọc-giả định, một heuristic vẫn có thể giúp ngay cả khi bạn không chắc chắn trước đó bộ nhớ nào. –

Trả lời

2

Bạn có thể sử dụng vmstat, systemtap và hoặc glibc 's malloc-hooks để theo dõi mức tiêu thụ. Bạn có thể sử dụng perf để xem lỗi xảy ra ở đâu để hiểu tác động thực tế của mức tiêu thụ. Nếu ứng dụng của bạn phải đối mặt với áp lực TLB khi bạn sử dụng các nhóm bộ nhớ lớn (ví dụ: bạn đang truyền qua lượng dữ liệu rất lớn), bạn có thể sử dụng các trang lớn/lớn để giảm thiểu phí trên 4k trang.

Bạn cũng có thể sử dụng madvise để báo cho hạt nhân từ bên trong các quy trình của bạn những gì bạn có thể sẽ làm với bộ nhớ được cấp phát.

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