0

[tracing] Add feature param for perfetto buffer params

To experiment with data loss / performance balance.

bug: 40574594
Change-Id: I327c9281a717057cc36c8a4db38a8f3cbb74661c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6318180
Commit-Queue: Etienne Pierre-Doray <etiennep@chromium.org>
Reviewed-by: Mikhail Khokhlov <khokhlov@google.com>
Cr-Commit-Position: refs/heads/main@{#1427748}
This commit is contained in:
Etienne Pierre-doray
2025-03-04 08:23:23 -08:00
committed by Chromium LUCI CQ
parent 5946483134
commit cbce8ba72f
6 changed files with 52 additions and 17 deletions

@ -8,6 +8,7 @@
#include "base/command_line.h"
#include "base/containers/flat_map.h"
#include "base/containers/flat_set.h"
#include "base/feature_list.h"
#include "base/memory/ptr_util.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/shared_memory_switch.h"
@ -22,6 +23,7 @@
#include "mojo/public/cpp/system/data_pipe_drainer.h"
#include "services/tracing/public/cpp/perfetto/shared_memory.h"
#include "services/tracing/public/cpp/perfetto/trace_packet_tokenizer.h"
#include "services/tracing/public/cpp/tracing_features.h"
#include "services/tracing/public/mojom/perfetto_service.mojom.h"
#include "services/tracing/public/mojom/tracing_service.mojom.h"
#include "third_party/perfetto/include/perfetto/base/task_runner.h"
@ -40,15 +42,6 @@ using ShmemMode = perfetto::SharedMemoryArbiter::ShmemMode;
namespace tracing {
namespace {
// TODO(crbug.com/40574593): Find a good compromise between performance and
// data granularity (mainly relevant to running with small buffer sizes
// when we use background tracing) on Android.
#if BUILDFLAG(IS_ANDROID)
constexpr size_t kDefaultSMBPageSizeBytes = 4 * 1024;
#else
constexpr size_t kDefaultSMBPageSizeBytes = 32 * 1024;
#endif
constexpr char kErrorTracingFailed[] = "Tracing failed";
} // namespace
@ -686,9 +679,9 @@ PerfettoTracingBackend::ConnectProducer(const ConnectProducerArgs& args) {
uint32_t shmem_size_hint = args.shmem_size_hint_bytes;
uint32_t shmem_page_size_hint = args.shmem_page_size_hint_bytes;
if (shmem_size_hint == 0)
shmem_size_hint = kDefaultSharedMemorySize;
shmem_size_hint = features::kPerfettoSharedMemorySizeBytes.Get();
if (shmem_page_size_hint == 0)
shmem_page_size_hint = kDefaultSMBPageSizeBytes;
shmem_page_size_hint = features::kPerfettoSMBPageSizeBytes.Get();
if (args.use_producer_provided_smb) {
auto* command_line = base::CommandLine::ForCurrentProcess();

@ -14,9 +14,6 @@
namespace tracing {
// TODO(crbug.com/40574594): Figure out a good buffer size.
inline constexpr size_t kDefaultSharedMemorySize = 4 * 1024 * 1024; // 4 KB
// This wraps //base's shmem implementation for Perfetto to consume.
class COMPONENT_EXPORT(TRACING_CPP) ChromeBaseSharedMemory
: public perfetto::SharedMemory {

@ -167,7 +167,8 @@ base::UnsafeSharedMemoryRegion CreateTracingOutputSharedMemory() {
}
#endif // DCHECK_IS_ON()
auto shm = base::UnsafeSharedMemoryRegion::Create(kDefaultSharedMemorySize);
auto shm = base::UnsafeSharedMemoryRegion::Create(
features::kPerfettoSharedMemorySizeBytes.Get());
if (!shm.IsValid()) {
return base::UnsafeSharedMemoryRegion();
}

@ -20,6 +20,7 @@
#include "services/tracing/public/cpp/perfetto/shared_memory.h"
#include "services/tracing/public/cpp/trace_startup.h"
#include "services/tracing/public/cpp/trace_startup_config.h"
#include "services/tracing/public/cpp/tracing_features.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/multiprocess_func_list.h"
@ -41,7 +42,7 @@ TEST(TraceStartupSharedMemoryTest, Create) {
auto shared_memory = CreateTracingOutputSharedMemory();
ASSERT_TRUE(shared_memory.IsValid());
EXPECT_EQ(kDefaultSharedMemorySize, shared_memory.GetSize());
EXPECT_EQ(kDefaultSharedMemorySizeBytes, shared_memory.GetSize());
}
MULTIPROCESS_TEST_MAIN(InitFromLaunchParameters) {
@ -82,7 +83,7 @@ MULTIPROCESS_TEST_MAIN(InitFromLaunchParameters) {
auto shmem_region = base::shared_memory::UnsafeSharedMemoryRegionFrom(
command_line->GetSwitchValueASCII(switches::kTraceBufferHandle));
EXPECT_TRUE(shmem_region->IsValid());
EXPECT_EQ(kDefaultSharedMemorySize, shmem_region->GetSize());
EXPECT_EQ(kDefaultSharedMemorySizeBytes, shmem_region->GetSize());
return 0;
}

@ -20,6 +20,14 @@
namespace features {
namespace {
BASE_FEATURE(kPerfettoBackendParams,
"kPerfettoBackendParams",
base::FEATURE_DISABLED_BY_DEFAULT);
} // namespace
// Runs the tracing service as an in-process browser service.
BASE_FEATURE(kTracingServiceInProcess,
"TracingServiceInProcess",
@ -44,6 +52,21 @@ BASE_FEATURE(kEnablePerfettoSystemBackgroundTracing,
"EnablePerfettoSystemBackgroundTracing",
base::FEATURE_DISABLED_BY_DEFAULT);
// Controls the preferred size of each page in the shmem buffer.
BASE_FEATURE_PARAM(int,
kPerfettoSMBPageSizeBytes,
&kPerfettoBackendParams,
"page_size_bytes",
tracing::kDefaultSMBPageSizeBytes);
// Controls the size of the shared memory buffer between the current process and
// the service backend(s)
BASE_FEATURE_PARAM(int,
kPerfettoSharedMemorySizeBytes,
&kPerfettoBackendParams,
"shared_memory_size_bytes",
tracing::kDefaultSharedMemorySizeBytes);
} // namespace features
namespace tracing {

@ -10,6 +10,7 @@
#include "base/component_export.h"
#include "base/feature_list.h"
#include "base/metrics/field_trial_params.h"
namespace features {
@ -24,10 +25,29 @@ extern const COMPONENT_EXPORT(TRACING_CPP) base::Feature
extern const COMPONENT_EXPORT(TRACING_CPP) base::Feature
kEnablePerfettoSystemBackgroundTracing;
COMPONENT_EXPORT(TRACING_CPP)
BASE_DECLARE_FEATURE_PARAM(int, kPerfettoSMBPageSizeBytes);
COMPONENT_EXPORT(TRACING_CPP)
BASE_DECLARE_FEATURE_PARAM(int, kPerfettoSharedMemorySizeBytes);
} // namespace features
namespace tracing {
// TODO(crbug.com/40574594): Figure out a good buffer size.
inline constexpr size_t kDefaultSharedMemorySizeBytes =
4 * 1024 * 1024; // 4 MB
// TODO(crbug.com/40574593): Find a good compromise between performance and
// data granularity (mainly relevant to running with small buffer sizes
// when we use background tracing) on Android.
#if BUILDFLAG(IS_ANDROID)
inline constexpr size_t kDefaultSMBPageSizeBytes = 4 * 1024;
#else
inline constexpr size_t kDefaultSMBPageSizeBytes = 32 * 1024;
#endif
// Returns true if the system tracing Perfetto producer should be setup. This
// can be influenced by the feature above or other situations (like debug
// android builds).