1818
1919#include < unistd.h>
2020#include < cmath>
21- #include < cstdint>
2221#include < cstring>
2322#include < filesystem>
2423#include < memory>
3332
3433#include " index/Index.h"
3534#include " index/IndexInfo.h"
36- #include " index/Meta.h"
3735#include " index/Utils.h"
3836#include " common/EasyAssert.h"
3937#include " config/ConfigKnowhere.h"
4442#include " common/FieldData.h"
4543#include " common/File.h"
4644#include " common/Slice.h"
47- #include " common/Tracer.h"
4845#include " common/RangeSearchHelper.h"
4946#include " common/Utils.h"
5047#include " log/Log.h"
51- #include " mmap/Types.h"
5248#include " storage/DataCodec.h"
5349#include " storage/MemFileManagerImpl.h"
5450#include " storage/ThreadPools.h"
5551#include " storage/space.h"
5652#include " storage/Util.h"
53+ #include " storage/prometheus_client.h"
5754
5855namespace milvus ::index {
5956
@@ -733,7 +730,8 @@ void VectorMemIndex<T>::LoadFromFile(const Config& config) {
733730 }
734731
735732 LOG_INFO (" load with slice meta: {}" , !slice_meta_filepath.empty ());
736-
733+ std::chrono::duration<double > load_duration_sum;
734+ std::chrono::duration<double > write_disk_duration_sum;
737735 if (!slice_meta_filepath
738736 .empty ()) { // load with the slice meta info, then we can load batch by batch
739737 std::string index_file_prefix = slice_meta_filepath.substr (
@@ -751,15 +749,20 @@ void VectorMemIndex<T>::LoadFromFile(const Config& config) {
751749 std::string prefix = item[NAME ];
752750 int slice_num = item[SLICE_NUM ];
753751 auto total_len = static_cast <size_t >(item[TOTAL_LEN ]);
754-
755752 auto HandleBatch = [&](int index) {
753+ auto start_load2_mem = std::chrono::system_clock::now ();
756754 auto batch_data = file_manager_->LoadIndexToMemory (batch);
755+ load_duration_sum +=
756+ (std::chrono::system_clock::now () - start_load2_mem);
757757 for (int j = index - batch.size () + 1 ; j <= index; j++) {
758758 std::string file_name = GenSlicedFileName (prefix, j);
759759 AssertInfo (batch_data.find (file_name) != batch_data.end (),
760760 " lost index slice data" );
761761 auto data = batch_data[file_name];
762+ auto start_write_file = std::chrono::system_clock::now ();
762763 auto written = file.Write (data->Data (), data->Size ());
764+ write_disk_duration_sum +=
765+ (std::chrono::system_clock::now () - start_write_file);
763766 AssertInfo (
764767 written == data->Size (),
765768 fmt::format (" failed to write index data to disk {}: {}" ,
@@ -784,24 +787,46 @@ void VectorMemIndex<T>::LoadFromFile(const Config& config) {
784787 }
785788 }
786789 } else {
790+ // 1. load files into memory
791+ auto start_load_files2_mem = std::chrono::system_clock::now ();
787792 auto result = file_manager_->LoadIndexToMemory (std::vector<std::string>(
788793 pending_index_files.begin (), pending_index_files.end ()));
794+ load_duration_sum +=
795+ (std::chrono::system_clock::now () - start_load_files2_mem);
796+ // 2. write data into files
797+ auto start_write_file = std::chrono::system_clock::now ();
789798 for (auto & [_, index_data] : result) {
790799 file.Write (index_data->Data (), index_data->Size ());
791800 }
792- }
801+ write_disk_duration_sum +=
802+ (std::chrono::system_clock::now () - start_write_file);
803+ }
804+ milvus::storage::internal_storage_download_duration.Observe (
805+ std::chrono::duration_cast<std::chrono::milliseconds>(load_duration_sum)
806+ .count ());
807+ milvus::storage::internal_storage_write_disk_duration.Observe (
808+ std::chrono::duration_cast<std::chrono::milliseconds>(
809+ write_disk_duration_sum)
810+ .count ());
793811 file.Close ();
794812
795813 LOG_INFO (" load index into Knowhere..." );
796814 auto conf = config;
797815 conf.erase (kMmapFilepath );
798816 conf[kEnableMmap ] = true ;
817+ auto start_deserialize = std::chrono::system_clock::now ();
799818 auto stat = index_.DeserializeFromFile (filepath.value (), conf);
819+ auto deserialize_duration =
820+ std::chrono::system_clock::now () - start_deserialize;
800821 if (stat != knowhere::Status::success) {
801822 PanicInfo (ErrorCode::UnexpectedError,
802823 " failed to Deserialize index: {}" ,
803824 KnowhereStatusString (stat));
804825 }
826+ milvus::storage::internal_storage_deserialize_duration.Observe (
827+ std::chrono::duration_cast<std::chrono::milliseconds>(
828+ deserialize_duration)
829+ .count ());
805830
806831 auto dim = index_.Dim ();
807832 this ->SetDim (index_.Dim ());
@@ -811,7 +836,18 @@ void VectorMemIndex<T>::LoadFromFile(const Config& config) {
811836 " failed to unlink mmap index file {}: {}" ,
812837 filepath.value (),
813838 strerror (errno));
814- LOG_INFO (" load vector index done" );
839+ LOG_INFO (
840+ " load vector index done, mmap_file_path:{}, download_duration:{}, "
841+ " write_files_duration:{}, deserialize_duration:{}" ,
842+ filepath.value (),
843+ std::chrono::duration_cast<std::chrono::milliseconds>(load_duration_sum)
844+ .count (),
845+ std::chrono::duration_cast<std::chrono::milliseconds>(
846+ write_disk_duration_sum)
847+ .count (),
848+ std::chrono::duration_cast<std::chrono::milliseconds>(
849+ deserialize_duration)
850+ .count ());
815851}
816852
817853template <typename T>
0 commit comments