mirror of
https://github.com/kvcache-ai/Mooncake.git
synced 2026-11-05 01:17:55 +00:00
[GH-ISSUE #848] [Feature Request]: Mooncake Store Speed up large-size segment mounting #256
Labels
No labels
ascend
auto-closed
bug
bug
CI/Build
Common
documentation
enhancement
feature request
good first issue
help wanted
high priority
MetaX
nightly-failure
pull-request
PyTorch Backend
question
RFC
Roadmap
stale
Store
Tests
Transfer Engine
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
kvcache-ai/Mooncake#256
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @xiaguan on GitHub (Sep 17, 2025).
Original GitHub issue: https://github.com/kvcache-ai/Mooncake/issues/848
Originally assigned to: @staryxchen on GitHub.
Describe your feature request
We've noticed that mounting very large memory segments (e.g., at the TB scale) can take several minutes, which hinders practical deployment.
The overhead mainly comes from two parts:
Actual physical allocation, where memset (or equivalent) might benefit from parallelization to speed it up.
Registration with RDMA — this could be accelerated by using pre-allocated large pages (e.g., 2MB or 1GB page sizes), which might also improve runtime performance.
Using large pages and parallel init could significantly reduce mounting time for such large segments.
Suggestions :
Also, if we’re adding more environment variables, it feels like we’re piling up too many already — makes the user experience pretty clunky. Maybe it’s time we support a builder pattern in the pyclient for more readable and maintainable config construction?
Before submitting a new issue...
@staryxchen commented on GitHub (Sep 17, 2025):
Hi @xiaguan
We encountered the same issue previously and implemented some optimizations. Test results show that the time required to register 500GB of memory has been reduced from over 87 seconds to just over 11 seconds (assuming memory is pre-allocated). I will submit a PR later.
@staryxchen commented on GitHub (Sep 17, 2025):
Hi @xiaguan @stmatengss
I have submitted the PR #855 , PTAL
@xiaguan commented on GitHub (Sep 18, 2025):
first‑touch minor faults for later reads.
@staryxchen commented on GitHub (Sep 18, 2025):
Perhaps we could touch-read all memory before calling
ibv_reg_mrin theregister_memoryfunction? However, I'm concerned that when memory is insufficient, this might cause the process to be killed due to OOM. Since the stack belongs to functions within the Mooncake Transfer Engine, this could lead to some misunderstandings.@xiaguan commented on GitHub (Sep 18, 2025):
Sure, we could do it at the store level first —we’re allocating a ton of memory for the storage service anyway.
@staryxchen commented on GitHub (Sep 18, 2025):
After further consideration, I believe implicit pre-allocated memory within mooncake remains feasible, as
ibv_reg_mralso pre-allocate memory. Since not all applications preallocate memory, enabling parallel registration without prior allocation could actually degrade performance.@ykwd commented on GitHub (Sep 23, 2025):
I made a series of benchmarks, the results of which may give some insights into how to speed up the mounting.
In all the benchmarks:
First, register 4 GB segment:
No pre-touch:
register time taken: 2550 ms
Pre-touch with 1 thread:
Touch time taken: 1884 ms
register time taken: 1562 ms
Pre-touch with 4 threads:
Touch time taken: 1869 ms
register time taken: 1373 ms
mmap
Alloc time taken: 1261 ms
register time taken: 1463 ms
Next, register 40 GB segment:
No pre-touch:
register time taken: 21825 ms
Pre-touch with 1 thread:
Touch time taken: 16318 ms
register time taken: 12898 ms
Pre-touch with 4 threads:
Touch time taken: 4996 ms
register time taken: 13565 ms
mmap:
Alloc time taken: 11287 ms
register time taken: 12672 ms
Register 160 GB segment:
No pre-touch:
register time taken: 76314 ms
Pre-touch with 1 thread:
Touch time taken: 64724 ms
register time taken: 35149 ms
Pre-touch with 4 threads:
Touch time taken: 23619 ms
register time taken: 36703 ms
Pre-touch with 16 threads:
Touch time taken: 17830 ms
register time taken: 36892 ms
mmap:
Alloc time taken: 44055 ms
register time taken: 35009 ms
From the above data, we can observe:
mmapmethod is faster than pre-touching, since pre-touching repeatedly switches between user mode and kernel mode. In fact, in this case, directly registering the memory without eithermmapor pre-touching is the fastest approach.Conclusion:
@ykwd commented on GitHub (Sep 23, 2025):
The benchmark of
RdmaTransport::registerLocalMemoryis conducted on a server with 8 mlx5 RDMA NICs.The register memory region time is recorded for each NIC.
Register 4 GB segment:
Without pre-touch
Register memory region time taken: 1307 ms
Register memory region time taken: 107 ms
Register memory region time taken: 106 ms
Register memory region time taken: 105 ms
Register memory region time taken: 103 ms
Register memory region time taken: 110 ms
Register memory region time taken: 105 ms
Register memory region time taken: 107 ms
Get memory location time taken: 216 ms
Add local memory buffer time taken: 1 ms
Total time taken: 2273 ms
With pre-touch:
Register memory region time taken: 161 ms
Register memory region time taken: 159 ms
Register memory region time taken: 159 ms
Register memory region time taken: 158 ms
Register memory region time taken: 159 ms
Register memory region time taken: 161 ms
Register memory region time taken: 157 ms
Register memory region time taken: 155 ms
Get memory location time taken: 265 ms
Add local memory buffer time taken: 1 ms
Total time taken: 1541 ms
Without pre-touch, parallel register:
Register memory region time taken: 7645 ms
Register memory region time taken: 7645 ms
Register memory region time taken: 7645 ms
Register memory region time taken: 7645 ms
Register memory region time taken: 7643 ms
Register memory region time taken: 7647 ms
Register memory region time taken: 7644 ms
Register memory region time taken: 7646 ms
Get memory location time taken: 266 ms
Add local memory buffer time taken: 1 ms
Total time taken: 7925 ms
With pre-touch, parallel register:
Register memory region time taken: 202 ms
Register memory region time taken: 202 ms
Register memory region time taken: 202 ms
Register memory region time taken: 202 ms
Register memory region time taken: 202 ms
Register memory region time taken: 202 ms
Register memory region time taken: 202 ms
Register memory region time taken: 202 ms
Get memory location time taken: 228 ms
Add local memory buffer time taken: 2 ms
Total time taken: 438 ms
Register 40 GB segment:
Without pre-touch
Register memory region time taken: 12045 ms
Register memory region time taken: 1082 ms
Register memory region time taken: 1084 ms
Register memory region time taken: 1090 ms
Register memory region time taken: 1072 ms
Register memory region time taken: 1105 ms
Register memory region time taken: 1220 ms
Register memory region time taken: 1213 ms
Get memory location time taken: 1636 ms
Add local memory buffer time taken: 1 ms
Total time taken: 21634 ms
With pre-touch:
Register memory region time taken: 1339 ms
Register memory region time taken: 1257 ms
Register memory region time taken: 1245 ms
Register memory region time taken: 1246 ms
Register memory region time taken: 1261 ms
Register memory region time taken: 1281 ms
Register memory region time taken: 1282 ms
Register memory region time taken: 1253 ms
Get memory location time taken: 1851 ms
Add local memory buffer time taken: 1 ms
Total time taken: 12083 ms
Without pre-touch, parallel register:
Register memory region time taken: 85478 ms
Register memory region time taken: 85479 ms
Register memory region time taken: 85484 ms
Register memory region time taken: 85493 ms
Register memory region time taken: 85494 ms
Register memory region time taken: 85499 ms
Register memory region time taken: 85498 ms
Register memory region time taken: 85502 ms
Get memory location time taken: 1825 ms
Add local memory buffer time taken: 1 ms
Total time taken: 87416 ms
With pre-touch, parallel register:
Register memory region time taken: 1665 ms
Register memory region time taken: 1667 ms
Register memory region time taken: 1676 ms
Register memory region time taken: 1680 ms
Register memory region time taken: 1681 ms
Register memory region time taken: 1684 ms
Register memory region time taken: 1689 ms
Register memory region time taken: 1704 ms
Get memory location time taken: 1878 ms
Add local memory buffer time taken: 2 ms
Total time taken: 3651 ms
Register 160 GB segment:
Without pre-touch
Register memory region time taken: 46193 ms
Register memory region time taken: 3310 ms
Register memory region time taken: 3308 ms
Register memory region time taken: 3311 ms
Register memory region time taken: 3278 ms
Register memory region time taken: 3246 ms
Register memory region time taken: 3246 ms
Register memory region time taken: 3269 ms
Get memory location time taken: 5805 ms
Add local memory buffer time taken: 1 ms
Total time taken: 75290 ms
With pre-touch:
Register memory region time taken: 3608 ms
Register memory region time taken: 3517 ms
Register memory region time taken: 3490 ms
Register memory region time taken: 3476 ms
Register memory region time taken: 3488 ms
Register memory region time taken: 3491 ms
Register memory region time taken: 3519 ms
Register memory region time taken: 3481 ms
Get memory location time taken: 5869 ms
Add local memory buffer time taken: 1 ms
Total time taken: 34223 ms
Without pre-touch, parallel register:
Not test
With pre-touch, parallel register:
Register memory region time taken: 4052 ms
Register memory region time taken: 4146 ms
Register memory region time taken: 4200 ms
Register memory region time taken: 4214 ms
Register memory region time taken: 4214 ms
Register memory region time taken: 4269 ms
Register memory region time taken: 4322 ms
Register memory region time taken: 4322 ms
Get memory location time taken: 5674 ms
Add local memory buffer time taken: 1 ms
Total time taken: 10261 ms
From the above data, we can observe:
Conclusion:
Combining this with the earlier pre-touching tests, we can conclude two practical strategies:
num_nic + 1threads to concurrently register the memory region and get memory locations.cc. @alogfans (Background: mooncake store needs to register hundreds or even 1TB memory; it will take several minutes to register. We want to speed up this process.)
@alogfans commented on GitHub (Sep 24, 2025):
@ykwd Thanks for your experiments. Pre-touching essentially reduce the overhead of page allocation (which may constraits by giant locks). Can allocating 2MB or even 2GB hugepages further reduce latency?
@ykwd commented on GitHub (Sep 28, 2025):
Solved in this pr: https://github.com/kvcache-ai/Mooncake/pull/875