2015-06-15 14 views
12

Có thể sửa đổi jemalloc để cấp phát từ bộ nhớ dùng chung không? Hàm FreeBSD dallocx() ngụ ý bạn có thể cung cấp con trỏ để sử dụng để phân bổ, nhưng tôi không thấy cách rõ ràng để cho biết jemalloc để hạn chế tất cả phân bổ từ bộ nhớ đó (cũng không đặt kích thước, v.v.).jemalloc, mmap và bộ nhớ dùng chung?

Chức năng dallocx() làm cho bộ nhớ được tham chiếu bởi ptr để sẵn sàng cho phân bổ trong tương lai.

Nếu không, mức độ nỗ lực cho tính năng đó là gì? Tôi đang đấu tranh để tìm một sơ đồ phân phối có sẵn có thể phân bổ từ một phần bộ nhớ chia sẻ mà tôi đã cung cấp.

Tương tự, bạn có thể định cấu hình jemalloc để phân bổ từ vùng bộ nhớ bị khóa để ngăn không cho hoán đổi không?

Vui lòng chỉ cho tôi các phần mã có liên quan yêu cầu sửa đổi và cung cấp bất kỳ ý tưởng hoặc đề xuất nào. Ý tưởng tôi đang khám phá là - vì bạn có thể tạo ra các đấu trường/heap để phân bổ trong môi trường luồng, như jemalloc để giảm thiểu tranh chấp, khái niệm này có thể mở rộng phân bổ vùng chia sẻ bộ nhớ trong môi trường đa xử lý, tức là tôi tạo N vùng chia sẻ bộ nhớ bằng cách sử dụng mmap() và tôi muốn tận dụng sức mạnh của jemalloc (hoặc bất kỳ lược đồ phân bổ nào) để phân bổ hiệu quả nhất có thể, với ganh đua tối thiểu, từ một trong những khu vực được chia sẻ đó, tức là nếu chủ đề/quy trình không truy cập vào cùng một khu vực được chia sẻ và đấu trường, cơ hội tranh chấp là tối thiểu và tốc độ của hoạt động malloc được tăng lên.

Điều này khác với hồ bơi chung được phân bổ với malloc() API vì thường những yêu cầu này yêu cầu khóa toàn cầu tuần tự hóa hiệu quả không gian người dùng. Tôi muốn tránh điều này.

chỉnh sửa 2:

Lý tưởng nhất là một api như thế này:

// init the alloc context to two shmem pools 
ctx1 = alloc_init(shm_region1_ptr); 
ctx2 = alloc_init(shm_region2_ptr); 

(... bunch of code determines pool 2 should be used, based on some method 
of pool selection which can minimize possibility of lock contention 
with other processes allocating shmem buffers) 

// allocate from pool2 
ptr = malloc(ctx2, size) 
+0

Điều này đánh tôi như một vấn đề XY. Bạn có đặc biệt muốn các thuộc tính của jemalloc cho bộ cấp phát bộ nhớ chia sẻ của bạn không? Toàn bộ điểm của jemalloc là nó cố gắng tránh chia sẻ ngay cả giữa các luồng trong cùng một quy trình (với chi phí lớn về mặt sử dụng bộ nhớ) để tối ưu hóa hiệu năng. Nếu bạn chỉ muốn một bộ cấp phát bộ nhớ chia sẻ với một API giống như malloc, đó là một chủ đề đơn giản hơn nhiều và không liên quan đến jemalloc. –

+0

AFAICT, 'dallocx()' tương đương với 'free()', vì vậy có lẽ không phải cái bạn muốn. – Hasturkun

+0

@ Hasturkun - vâng, tôi đoán tôi đã quá lạc quan rằng một số móc cho những gì tôi sau khi được cung cấp. –

Trả lời

4

Yes. Nhưng điều này không đúng khi bạn đặt câu hỏi.

Jemalloc 4 (phát hành vào tháng 8 năm 2015) có một vài không gian tên là mallctl hữu ích cho mục đích này; chúng cho phép bạn chỉ định các móc phân bổ đoạn cụ thể cho từng ứng dụng. Đặc biệt, không gian tên arena.<i>.chunk_hooks và các tùy chọn arenas.extendmallctl được sử dụng. An integration test tồn tại thể hiện cách sử dụng API này.

Về cơ sở lý luận, tôi cho rằng chi phí "nhắn tin" hiệu quả được yêu cầu để hiểu nơi tranh chấp trên bất kỳ phân đoạn bộ nhớ cụ thể nào sẽ tương tự như chi phí chỉ cạnh tranh, vì bạn sẽ phân tích thành tranh chấp dòng bộ nhớ cache để cập nhật chính xác giá trị "ganh đua" của một đấu trường cụ thể.

Vì jemalloc đã sử dụng một số kỹ thuật để giảm tranh chấp, bạn có thể có được một hành vi tương tự trong môi trường có luồng cao bằng cách tạo thêm các đấu trường với opt.narenas. Điều này sẽ làm giảm ganh đua vì ít chủ đề hơn sẽ được ánh xạ tới một đấu trường, nhưng vì các chủ đề có hiệu quả vòng quanh, nên có thể bạn sẽ bị nóng điểm.

Để giải quyết vấn đề này, bạn có thể thực hiện đếm đếm và phát hiện điểm phát sóng, và chỉ cần sử dụng giao diện thread.arenamallctl để chuyển một chủ đề sang đấu trường ít tranh cãi hơn.

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