Tài liệu

Benchmark bộ nhớ và lưu trữ

Thời gian đọc 4 phút
Trên trang này

Nalix sử dụng một hệ thống quản lý bộ nhớ được tối ưu cao, được thiết kế để loại bỏ các lần tạm dừng do Garbage Collection (GC) trong các khối lượng công việc thông lượng cao.

Buffer Pooling và Lease

So sánh các chiến lược lấy bộ nhớ theo nhiều kích thước khác nhau (64 B, 1 KB và 16 KB).

Chỉ số cấp phát bộ đệm (Size = 64)

Phương thứcMeanErrorStdDevP95Tỷ lệCấp phátTỷ lệ cấp phát
RawAllocation16.974 ns1.3931 ns1.6043 ns19.503 ns1.0188 B1.00
ArrayPool_Shared10.824 ns0.3976 ns0.4579 ns11.244 ns0.640 B0.00
BufferPoolManager_RentReturn23.905 ns0.6627 ns0.7632 ns24.545 ns1.420 B0.00
BufferLease_RentDispose54.052 ns0.5018 ns0.5778 ns54.617 ns3.210 B0.00

Chỉ số cấp phát bộ đệm (Size = 1024)

Phương thứcMeanErrorStdDevP95Tỷ lệCấp phátTỷ lệ cấp phát
RawAllocation159.487 ns29.9061 ns34.4399 ns194.306 ns1.061048 B1.00
ArrayPool_Shared6.406 ns0.0902 ns0.1039 ns6.556 ns0.040 B0.00
BufferPoolManager_RentReturn24.173 ns0.4341 ns0.4999 ns24.471 ns0.160 B0.00
BufferLease_RentDispose62.729 ns1.1419 ns1.3150 ns63.688 ns0.420 B0.00

Chỉ số cấp phát bộ đệm (Size = 16384)

Phương thứcMeanErrorStdDevP95Tỷ lệCấp phátTỷ lệ cấp phát
RawAllocation2,608.051 ns452.9858 ns521.6591 ns3,035.733 ns1.06216408 B1.00
ArrayPool_Shared10.496 ns0.8494 ns0.9782 ns11.159 ns0.0040 B0.00
BufferPoolManager_RentReturn23.769 ns0.6516 ns0.7504 ns24.451 ns0.0100 B0.00
BufferLease_RentDispose53.938 ns1.3191 ns1.5190 ns54.873 ns0.0220 B0.00

Vì sao bộ nhớ của Nalix?

  • Thuê mảng có pool (BufferPoolManager): BufferPoolManager bọc ArrayPool<byte>.Shared với các bộ đếm thuê/trả nguyên tử và chẩn đoán rò rỉ bộ nhớ tùy chọn (BufferOptions.EnableBufferLeakDetection), mang lại 0 B cấp phát trên mọi kích thước payload.
  • An toàn lease có đếm tham chiếu (BufferLease): BufferLease cung cấp một lớp bọc thuê có pool và đếm tham chiếu (Retain() / Dispose()) (IBufferLease), giữ cho các chu kỳ thuê/giải phóng không cấp phát (0 B) đồng thời ngăn việc trả bộ đệm sớm qua các ranh giới bất đồng bộ.

Object Pooling

Chỉ số bộ nhớ khi tái sử dụng các thể hiện class thông qua object pool.

Phương thứcMeanErrorStdDevP95Tỷ lệCấp phátTỷ lệ cấp phát
RawAllocation8.016 ns0.4384 ns0.5049 ns8.474 ns1.0032 B1.00
RentAndReturn_ObjectPool157.624 ns5.2398 ns6.0342 ns161.363 ns19.740 B0.00

Đằng sau thiết kế

  • Tái sử dụng đối tượng: Tái sử dụng các thể hiện của cấu trúc phức tạp (như trạng thái phiên, envelope gói tin và ngữ cảnh xử lý) giúp tránh tình trạng GC Gen 0 bị quá tải.
  • Kiến trúc đường nhanh lai:
    • Cache theo luồng (Thread-Local Cache): Tầng đầu tiên, tra cứu không khóa, lưu cache các thể hiện đối tượng trong thread-local storage (ThreadLocalCache<T>) để tái sử dụng với độ trễ cực thấp trên cùng một luồng.
    • Bucket theo chỉ số kiểu (Type-Indexed Buckets): Khi các slot thread-local trống hoặc đầy, việc lấy đối tượng sẽ chuyển sang tra cứu dựa trên mảng, sử dụng ID kiểu đã biên dịch (PoolType<T>.Id) để bỏ qua việc băm chậm hoặc tra cứu dictionary generic.
  • Logic reset: Để tránh trạng thái bị ô nhiễm giữa các lần thuê, các đối tượng trong pool triển khai interface reset (IPoolable), tự động xóa dữ liệu và chuẩn bị thể hiện để tái sử dụng khi được trả về pool.