diff --git a/internal/core/src/segcore/SegmentSealedImpl.cpp b/internal/core/src/segcore/SegmentSealedImpl.cpp index 6154678391..e1f37e4b4c 100644 --- a/internal/core/src/segcore/SegmentSealedImpl.cpp +++ b/internal/core/src/segcore/SegmentSealedImpl.cpp @@ -152,9 +152,13 @@ SegmentSealedImpl::WarmupChunkCache(const FieldId field_id, bool mmap_enabled) { auto field_info = it->second; auto cc = storage::MmapManager::GetInstance().GetChunkCache(); + bool mmap_rss_not_need = true; for (const auto& data_path : field_info.insert_files) { - auto column = - cc->Read(data_path, mmap_descriptor_, field_meta, mmap_enabled); + auto column = cc->Read(data_path, + mmap_descriptor_, + field_meta, + mmap_enabled, + mmap_rss_not_need); } } diff --git a/internal/core/src/storage/ChunkCache.cpp b/internal/core/src/storage/ChunkCache.cpp index 10871babf9..54661453d9 100644 --- a/internal/core/src/storage/ChunkCache.cpp +++ b/internal/core/src/storage/ChunkCache.cpp @@ -24,7 +24,8 @@ std::shared_ptr ChunkCache::Read(const std::string& filepath, const MmapChunkDescriptorPtr& descriptor, const FieldMeta& field_meta, - bool mmap_enabled) { + bool mmap_enabled, + bool mmap_rss_not_need) { // use rlock to get future { std::shared_lock lck(mutex_); @@ -64,6 +65,22 @@ ChunkCache::Read(const std::string& filepath, field_data = DownloadAndDecodeRemoteFile(cm_.get(), filepath); column = Mmap( field_data->GetFieldData(), descriptor, field_meta, mmap_enabled); + if (mmap_enabled && mmap_rss_not_need) { + auto ok = madvise(reinterpret_cast( + const_cast(column->MmappedData())), + column->ByteSize(), + ReadAheadPolicy_Map["dontneed"]); + if (ok != 0) { + LOG_WARN( + "failed to madvise to the data file {}, addr {}, size {}, " + "err: " + "{}", + filepath, + static_cast(column->MmappedData()), + column->ByteSize(), + strerror(errno)); + } + } allocate_success = true; } catch (const SegcoreError& e) { err_code = e.get_error_code(); @@ -113,7 +130,7 @@ ChunkCache::Prefetch(const std::string& filepath) { LOG_WARN( "failed to madvise to the data file {}, addr {}, size {}, err: {}", filepath, - column->MmappedData(), + static_cast(column->MmappedData()), column->ByteSize(), strerror(errno)); } diff --git a/internal/core/src/storage/ChunkCache.h b/internal/core/src/storage/ChunkCache.h index b2b36c6ec4..64be0ae319 100644 --- a/internal/core/src/storage/ChunkCache.h +++ b/internal/core/src/storage/ChunkCache.h @@ -48,7 +48,8 @@ class ChunkCache { Read(const std::string& filepath, const MmapChunkDescriptorPtr& descriptor, const FieldMeta& field_meta, - bool mmap_enabled); + bool mmap_enabled, + bool mmap_rss_not_need = false); void Remove(const std::string& filepath);