1515#include < Common/CurrentMetrics.h>
1616#include < Common/FailPoint.h>
1717#include < Common/Logger.h>
18+ #include < Common/MemoryAllocTrace.h>
1819#include < Common/PODArray.h>
1920#include < Common/SyncPoint/Ctl.h>
2021#include < DataStreams/OneBlockInputStream.h>
@@ -607,59 +608,11 @@ try
607608}
608609CATCH
609610
610-
611- namespace
612- {
613- struct ProcessMemoryUsage
614- {
615- double resident_mb;
616- Int64 cur_proc_num_threads;
617- double cur_virt_mb;
618- };
619-
620- bool process_mem_usage (double & resident_set, Int64 & cur_proc_num_threads, UInt64 & cur_virt_size)
611+ double get_process_resident_mb ()
621612{
622- resident_set = 0.0 ;
623-
624- // 'file' stat seems to give the most reliable results
625- std::ifstream stat_stream (" /proc/self/stat" , std::ios_base::in);
626- // if "/proc/self/stat" is not supported
627- if (!stat_stream.is_open ())
628- return false ;
629-
630- // dummy vars for leading entries in stat that we don't care about
631- std::string pid, comm, state, ppid, pgrp, session, tty_nr;
632- std::string tpgid, flags, minflt, cminflt, majflt, cmajflt;
633- std::string utime, stime, cutime, cstime, priority, nice;
634- std::string itrealvalue, starttime;
635-
636- // the field we want
637- Int64 rss;
638-
639- stat_stream >> pid >> comm >> state >> ppid >> pgrp >> session >> tty_nr >> tpgid >> flags >> minflt >> cminflt
640- >> majflt >> cmajflt >> utime >> stime >> cutime >> cstime >> priority >> nice >> cur_proc_num_threads
641- >> itrealvalue >> starttime >> cur_virt_size >> rss; // don't care about the rest
642-
643- stat_stream.close ();
644-
645- Int64 page_size_kb = sysconf (_SC_PAGE_SIZE) / 1024 ; // in case x86-64 is configured to use 2MB pages
646- resident_set = rss * page_size_kb;
647- return true ;
613+ auto mu = DB::get_process_mem_usage ();
614+ return mu.resident_bytes / 1024.0 / 1024 ;
648615}
649- ProcessMemoryUsage get_process_mem_usage ()
650- {
651- double resident_set;
652- Int64 cur_proc_num_threads = 1 ;
653- UInt64 cur_virt_size = 0 ;
654- process_mem_usage (resident_set, cur_proc_num_threads, cur_virt_size);
655- resident_set *= 1024 ; // unit: byte
656- return ProcessMemoryUsage{
657- resident_set / 1024.0 / 1024 ,
658- cur_proc_num_threads,
659- cur_virt_size / 1024.0 / 1024 ,
660- };
661- }
662- } // namespace
663616
664617TEST_F (SegmentOperationTest, TestMassiveSegment)
665618try
@@ -685,21 +638,17 @@ try
685638 next_split_seg_id = *n_seg_id;
686639 if (i % progress_interval == 0 )
687640 {
688- auto mu = get_process_mem_usage ();
689641 LOG_INFO (
690642 log,
691643 " lvl={} round={} split_point={} next_seg_id={} mem_resident_set={:.3f}MB)" ,
692644 lvl,
693645 i,
694646 split_point,
695647 *n_seg_id,
696- mu. resident_mb );
648+ get_process_resident_mb () );
697649 }
698650 }
699- {
700- auto mu = get_process_mem_usage ();
701- LOG_INFO (log, " lvl={} round={} mem_resident_set={:.3f}MB" , lvl, num_expected_segs, mu.resident_mb );
702- }
651+ LOG_INFO (log, " lvl={} round={} mem_resident_set={:.3f}MB" , lvl, num_expected_segs, get_process_resident_mb ());
703652
704653 size_t round = 0 ;
705654 for (auto && [seg_id, seg] : segments)
@@ -715,14 +664,13 @@ try
715664 size_t write_rows_sub = 2 ;
716665 if (round % progress_interval == 0 )
717666 {
718- auto mu = get_process_mem_usage ();
719667 LOG_INFO (
720668 log,
721669 " lvl={} round={} written_rows={} mem_resident_set={:.3f}MB" ,
722670 lvl,
723671 round,
724672 write_rows * round,
725- mu. resident_mb );
673+ get_process_resident_mb () );
726674 }
727675 for (size_t k = 0 ; k < 2 ; ++k)
728676 {
@@ -746,13 +694,12 @@ try
746694 round++;
747695 }
748696 {
749- auto mu = get_process_mem_usage ();
750697 LOG_INFO (
751698 log,
752699 " TestMassiveSegment done, segments.size()={} lvl={} mem_resident_set={:.3f}MB" ,
753700 segments.size (),
754701 lvl,
755- mu. resident_mb );
702+ get_process_resident_mb () );
756703 }
757704 }
758705}
0 commit comments