Add cpu_usage metrics.

Implemented an analogue of the cpu_usage metrics from third_party/webrtc/video/video_analyzer.h for third_party/webrtc/test/pc/e2e/analyzer/video/default_video_quality_analyzer.h

Bug: webrtc:11496
Change-Id: Ifdc9daa3351f1df5db98beb8f7dc7156fc7c2a16
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/174020
Reviewed-by: Artem Titov <titovartem@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#31141}
This commit is contained in:
Andrey Logvin
2020-04-28 07:55:47 +00:00
parent 012aa375b1
commit 3b9fe99285
3 changed files with 51 additions and 0 deletions

View File

@ -575,8 +575,10 @@ rtc_library("default_video_quality_analyzer") {
"../../../rtc_base:criticalsection",
"../../../rtc_base:logging",
"../../../rtc_base:rtc_base_approved",
"../../../rtc_base:rtc_base_tests_utils",
"../../../rtc_base:rtc_event",
"../../../rtc_base:rtc_numerics",
"../../../rtc_base:timeutils",
"../../../system_wrappers",
]
}

View File

@ -17,7 +17,9 @@
#include "api/units/time_delta.h"
#include "api/video/i420_buffer.h"
#include "common_video/libyuv/include/webrtc_libyuv.h"
#include "rtc_base/cpu_time.h"
#include "rtc_base/logging.h"
#include "rtc_base/time_utils.h"
namespace webrtc {
namespace webrtc_pc_e2e {
@ -92,6 +94,7 @@ void DefaultVideoQualityAnalyzer::Start(std::string test_case_name,
state_ = State::kActive;
start_time_ = Now();
}
StartMeasuringCpuProcessTime();
}
uint16_t DefaultVideoQualityAnalyzer::OnFrameCaptured(
@ -336,6 +339,7 @@ void DefaultVideoQualityAnalyzer::OnDecoderError(uint16_t frame_id,
}
void DefaultVideoQualityAnalyzer::Stop() {
StopMeasuringCpuProcessTime();
{
rtc::CritScope crit(&lock_);
if (state_ == State::kStopped) {
@ -429,6 +433,7 @@ void DefaultVideoQualityAnalyzer::AddComparison(
absl::optional<VideoFrame> rendered,
bool dropped,
FrameStats frame_stats) {
StartExcludingCpuThreadTime();
rtc::CritScope crit(&comparison_lock_);
analyzer_stats_.comparisons_queue_size.AddSample(comparisons_.size());
// If there too many computations waiting in the queue, we won't provide
@ -445,6 +450,7 @@ void DefaultVideoQualityAnalyzer::AddComparison(
frame_stats, overload_reason);
}
comparison_available_event_.Set();
StopExcludingCpuThreadTime();
}
void DefaultVideoQualityAnalyzer::ProcessComparisonsThread(void* obj) {
@ -481,7 +487,9 @@ void DefaultVideoQualityAnalyzer::ProcessComparisons() {
continue;
}
StartExcludingCpuThreadTime();
ProcessComparison(comparison.value());
StopExcludingCpuThreadTime();
}
}
@ -565,12 +573,16 @@ void DefaultVideoQualityAnalyzer::ProcessComparison(
}
void DefaultVideoQualityAnalyzer::ReportResults() {
using ::webrtc::test::ImproveDirection;
rtc::CritScope crit1(&lock_);
rtc::CritScope crit2(&comparison_lock_);
for (auto& item : stream_stats_) {
ReportResults(GetTestCaseName(item.first), item.second,
stream_frame_counters_.at(item.first));
}
test::PrintResult("cpu_usage", "", test_label_.c_str(), GetCpuUsagePercent(),
"%", false, ImproveDirection::kSmallerIsBetter);
LogFrameCounters("Global", frame_counters_);
for (auto& item : stream_stats_) {
LogFrameCounters(item.first, stream_frame_counters_.at(item.first));
@ -702,6 +714,33 @@ Timestamp DefaultVideoQualityAnalyzer::Now() {
return clock_->CurrentTime();
}
void DefaultVideoQualityAnalyzer::StartMeasuringCpuProcessTime() {
rtc::CritScope lock(&cpu_measurement_lock_);
cpu_time_ -= rtc::GetProcessCpuTimeNanos();
wallclock_time_ -= rtc::SystemTimeNanos();
}
void DefaultVideoQualityAnalyzer::StopMeasuringCpuProcessTime() {
rtc::CritScope lock(&cpu_measurement_lock_);
cpu_time_ += rtc::GetProcessCpuTimeNanos();
wallclock_time_ += rtc::SystemTimeNanos();
}
void DefaultVideoQualityAnalyzer::StartExcludingCpuThreadTime() {
rtc::CritScope lock(&cpu_measurement_lock_);
cpu_time_ += rtc::GetThreadCpuTimeNanos();
}
void DefaultVideoQualityAnalyzer::StopExcludingCpuThreadTime() {
rtc::CritScope lock(&cpu_measurement_lock_);
cpu_time_ -= rtc::GetThreadCpuTimeNanos();
}
double DefaultVideoQualityAnalyzer::GetCpuUsagePercent() {
rtc::CritScope lock(&cpu_measurement_lock_);
return static_cast<double>(cpu_time_) / wallclock_time_ * 100.0;
}
DefaultVideoQualityAnalyzer::FrameStats::FrameStats(std::string stream_label,
Timestamp captured_time)
: stream_label(std::move(stream_label)), captured_time(captured_time) {}

View File

@ -293,6 +293,12 @@ class DefaultVideoQualityAnalyzer : public VideoQualityAnalyzerInterface {
std::string GetTestCaseName(const std::string& stream_label) const;
Timestamp Now();
void StartMeasuringCpuProcessTime();
void StopMeasuringCpuProcessTime();
void StartExcludingCpuThreadTime();
void StopExcludingCpuThreadTime();
double GetCpuUsagePercent();
const bool heavy_metrics_computation_enabled_;
const int max_frames_in_flight_per_stream_count_;
webrtc::Clock* const clock_;
@ -337,6 +343,10 @@ class DefaultVideoQualityAnalyzer : public VideoQualityAnalyzerInterface {
std::vector<std::unique_ptr<rtc::PlatformThread>> thread_pool_;
rtc::Event comparison_available_event_;
rtc::CriticalSection cpu_measurement_lock_;
int64_t cpu_time_ RTC_GUARDED_BY(cpu_measurement_lock_) = 0;
int64_t wallclock_time_ RTC_GUARDED_BY(cpu_measurement_lock_) = 0;
};
} // namespace webrtc_pc_e2e