@@ -36,6 +36,22 @@ BackgroundMover<CacheT>::BackgroundMover(
3636 }
3737}
3838
39+ template <typename CacheT>
40+ void BackgroundMover<CacheT>::TraversalStats::recordTraversalTime(uint64_t msTaken) {
41+ lastTraversalTimeMs_.store (msTaken, std::memory_order_relaxed);
42+ minTraversalTimeMs_.store (std::min (minTraversalTimeMs_.load (), msTaken),
43+ std::memory_order_relaxed);
44+ maxTraversalTimeMs_.store (std::max (maxTraversalTimeMs_.load (), msTaken),
45+ std::memory_order_relaxed);
46+ totalTraversalTimeMs_.fetch_add (msTaken, std::memory_order_relaxed);
47+ }
48+
49+ template <typename CacheT>
50+ uint64_t BackgroundMover<CacheT>::TraversalStats::getAvgTraversalTimeMs(
51+ uint64_t numTraversals) const {
52+ return numTraversals ? totalTraversalTimeMs_ / numTraversals : 0 ;
53+ }
54+
3955template <typename CacheT>
4056BackgroundMover<CacheT>::~BackgroundMover () {
4157 stop (std::chrono::seconds (0 ));
@@ -73,6 +89,7 @@ void BackgroundMover<CacheT>::checkAndRun() {
7389 std::set<ClassId> classes{};
7490 auto batches = strategy_->calculateBatchSizes (cache_, assignedMemory);
7591
92+ const auto begin = util::getCurrentTimeNs ();
7693 // const auto& mpStats = cache_.getPoolByTid(0, 0).getStats();
7794 for (size_t i = 0 ; i < batches.size (); i++) {
7895 const auto [tid, pid, cid] = assignedMemory[i];
@@ -87,28 +104,39 @@ void BackgroundMover<CacheT>::checkAndRun() {
87104 // try moving BATCH items from the class in order to reach free target
88105 auto moved = moverFunc (cache_, tid, pid, cid, batch);
89106 moves += moved;
90- moves_per_class_[tid][pid][cid ] += moved;
107+ moves_per_class_[assignedMemory[i] ] += moved;
91108 // totalBytesMoved.add(moved * mpStats.acStats.at(cid).allocSize);
92109 }
110+ auto end = util::getCurrentTimeNs ();
111+ if (moves > 0 ) {
112+ traversalStats_.recordTraversalTime (end > begin ? end - begin : 0 );
113+ numMovedItems.add (moves);
114+ numTraversals.inc ();
115+ totalClasses.add (classes.size ());
116+ }
93117
94- numTraversals.inc ();
95- numMovedItems.add (moves);
96- totalClasses.add (classes.size ());
97118}
98119
99120template <typename CacheT>
100121BackgroundMoverStats BackgroundMover<CacheT>::getStats() const noexcept {
101122 BackgroundMoverStats stats;
102123 stats.numMovedItems = numMovedItems.get ();
103- stats.runCount = numTraversals.get ();
104124 stats.totalBytesMoved = totalBytesMoved.get ();
105125 stats.totalClasses = totalClasses.get ();
126+ auto runCount = getRunCount ();
127+ stats.runCount = runCount;
128+ stats.numTraversals = numTraversals.get ();
129+ stats.avgItemsMoved = (double ) stats.numMovedItems / (double )runCount;
130+ stats.lastTraversalTimeMs = traversalStats_.getLastTraversalTimeMs ();
131+ stats.avgTraversalTimeMs = traversalStats_.getAvgTraversalTimeMs (runCount);
132+ stats.minTraversalTimeMs = traversalStats_.getMinTraversalTimeMs ();
133+ stats.maxTraversalTimeMs = traversalStats_.getMaxTraversalTimeMs ();
106134
107135 return stats;
108136}
109137
110138template <typename CacheT>
111- std::map<TierId, std::map<PoolId, std::map<ClassId, uint64_t >> >
139+ std::map<MemoryDescriptorType, uint64_t >
112140BackgroundMover<CacheT>::getClassStats() const noexcept {
113141 return moves_per_class_;
114142}
0 commit comments