diff options
author | Yabin Cui <yabinc@google.com> | 2022-03-31 16:01:36 -0700 |
---|---|---|
committer | Yabin Cui <yabinc@google.com> | 2022-03-31 16:01:36 -0700 |
commit | 1c3f6a483ea2746f2470e886dacd76f30b834156 (patch) | |
tree | 8b0820167323786d06305d5eca0a2639cb6e3833 | |
parent | 43ccc71e3db77bc289e41c2986881718d5922028 (diff) | |
download | extras-1c3f6a483ea2746f2470e886dacd76f30b834156.tar.gz |
simpleperf: Make stop recording time more accurate.
simpleperf stops recording in FinishReadMmapEventData(). It contains
two steps:
1. Stop record read thread.
2. Process records in userspace buffer.
But if the second steps takes significant time, users may think
simpleperf doesn't receive the stop recording command. To avoid that,
this CL moves the second step to post processing.
This CL also closes event files when stopping recording. That
prevents the kernel from generating more samples, which may slow down
post processing.
Bug: 227220328
Test: run simpleperf_unit_test
Change-Id: Ib5a11b7ce039e2133a9070a10508da514197e610
-rw-r--r-- | simpleperf/cmd_monitor.cpp | 4 | ||||
-rw-r--r-- | simpleperf/cmd_record.cpp | 18 | ||||
-rw-r--r-- | simpleperf/event_selection_set.cpp | 9 |
3 files changed, 17 insertions, 14 deletions
diff --git a/simpleperf/cmd_monitor.cpp b/simpleperf/cmd_monitor.cpp index ed9edfac..355f9d51 100644 --- a/simpleperf/cmd_monitor.cpp +++ b/simpleperf/cmd_monitor.cpp @@ -291,6 +291,10 @@ bool MonitorCommand::DoMonitoring() { if (!event_selection_set_.GetIOEventLoop()->RunLoop()) { return false; } + if (!event_selection_set_.SyncKernelBuffer()) { + return false; + } + event_selection_set_.CloseEventFiles(); if (!event_selection_set_.FinishReadMmapEventData()) { return false; } diff --git a/simpleperf/cmd_record.cpp b/simpleperf/cmd_record.cpp index b84bcfab..1c53dc1c 100644 --- a/simpleperf/cmd_record.cpp +++ b/simpleperf/cmd_record.cpp @@ -718,9 +718,10 @@ bool RecordCommand::DoRecording(Workload* workload) { return false; } time_stat_.stop_recording_time = GetSystemClock(); - if (!event_selection_set_.FinishReadMmapEventData()) { + if (!event_selection_set_.SyncKernelBuffer()) { return false; } + event_selection_set_.CloseEventFiles(); time_stat_.finish_recording_time = GetSystemClock(); uint64_t recording_time = time_stat_.finish_recording_time - time_stat_.start_recording_time; LOG(INFO) << "Recorded for " << recording_time / 1e9 << " seconds. Start post processing."; @@ -754,26 +755,31 @@ static bool WriteRecordDataToOutFd(const std::string& in_filename, } bool RecordCommand::PostProcessRecording(const std::vector<std::string>& args) { - // 1. Merge map records dumped while recording by map record thread. + // 1. Read records left in the buffer. + if (!event_selection_set_.FinishReadMmapEventData()) { + return false; + } + + // 2. Merge map records dumped while recording by map record thread. if (map_record_thread_) { if (!map_record_thread_->Join() || !MergeMapRecords()) { return false; } } - // 2. Post unwind dwarf callchain. + // 3. Post unwind dwarf callchain. if (unwind_dwarf_callchain_ && post_unwind_) { if (!PostUnwindRecords()) { return false; } } - // 3. Optionally join Callchains. + // 4. Optionally join Callchains. if (callchain_joiner_) { JoinCallChains(); } - // 4. Dump additional features, and close record file. + // 5. Dump additional features, and close record file. if (!DumpAdditionalFeatures(args)) { return false; } @@ -785,7 +791,7 @@ bool RecordCommand::PostProcessRecording(const std::vector<std::string>& args) { } time_stat_.post_process_time = GetSystemClock(); - // 4. Show brief record result. + // 6. Show brief record result. auto record_stat = event_selection_set_.GetRecordStat(); if (event_selection_set_.HasAuxTrace()) { LOG(INFO) << "Aux data traced: " << record_stat.aux_data_size; diff --git a/simpleperf/event_selection_set.cpp b/simpleperf/event_selection_set.cpp index d5bca318..58b4b956 100644 --- a/simpleperf/event_selection_set.cpp +++ b/simpleperf/event_selection_set.cpp @@ -840,14 +840,7 @@ bool EventSelectionSet::ReadMmapEventData(bool with_time_limit) { } bool EventSelectionSet::FinishReadMmapEventData() { - // Stop the read thread, so we don't get more records beyond current time. - if (!SyncKernelBuffer() || !record_read_thread_->StopReadThread()) { - return false; - } - if (!ReadMmapEventData(false)) { - return false; - } - return true; + return ReadMmapEventData(false); } void EventSelectionSet::CloseEventFiles() { |