feat: add --perfmon-trace-file and -o perfmon_trace_file

This commit is contained in:
Marcus Holland-Moritz 2024-04-27 15:24:30 +02:00
parent 80f84c6f44
commit d0626212a8
4 changed files with 33 additions and 9 deletions

View File

@ -156,8 +156,12 @@ options:
- `-o perfmon=`*name*: - `-o perfmon=`*name*:
Enable performance monitoring for the list of comma-separated components. Enable performance monitoring for the list of comma-separated components.
This option is only available if the project was built with performance This option is only available if the project was built with performance
monitoring enabled. Available components include `fuse`, `filesystem_v2` monitoring enabled. Available components include `fuse`, `filesystem_v2`,
and `inode_reader_v2`. `inode_reader_v2` and `block_cache`.
- `-o perfmon_trace=`*file*:
Write JSON trace data for all components enabled by `--perfmon` to this
file when the process exits.
- `--man`: - `--man`:
If the project was built with support for built-in manual pages, this If the project was built with support for built-in manual pages, this

View File

@ -93,8 +93,12 @@ to disk:
- `--perfmon=`*name*: - `--perfmon=`*name*:
Enable performance monitoring for the list of comma-separated components. Enable performance monitoring for the list of comma-separated components.
This option is only available if the project was built with performance This option is only available if the project was built with performance
monitoring enabled. Available components include `fuse`, `filesystem_v2` monitoring enabled. Available components include `fuse`, `filesystem_v2`,
and `inode_reader_v2`. `inode_reader_v2` and `block_cache`.
- `--perfmon-trace=`*file*:
Write JSON trace data for all components enabled by `--perfmon` to this
file when the process exits.
- `-h`, `--help`: - `-h`, `--help`:
Show program help, including option defaults. Show program help, including option defaults.

View File

@ -159,7 +159,8 @@ struct options {
char const* cache_tidy_interval_str{nullptr}; // TODO: const?? -> use string? char const* cache_tidy_interval_str{nullptr}; // TODO: const?? -> use string?
char const* cache_tidy_max_age_str{nullptr}; // TODO: const?? -> use string? char const* cache_tidy_max_age_str{nullptr}; // TODO: const?? -> use string?
#if DWARFS_PERFMON_ENABLED #if DWARFS_PERFMON_ENABLED
char const* perfmon_enabled_str{nullptr}; // TODO: const?? -> use string? char const* perfmon_enabled_str{nullptr}; // TODO: const?? -> use string?
char const* perfmon_trace_file_str{nullptr}; // TODO: const?? -> use string?
#endif #endif
int enable_nlink{0}; int enable_nlink{0};
int readonly{0}; int readonly{0};
@ -237,6 +238,7 @@ constexpr struct ::fuse_opt dwarfs_opts[] = {
DWARFS_OPT("no_cache_files", cache_files, 0), DWARFS_OPT("no_cache_files", cache_files, 0),
#if DWARFS_PERFMON_ENABLED #if DWARFS_PERFMON_ENABLED
DWARFS_OPT("perfmon=%s", perfmon_enabled_str, 0), DWARFS_OPT("perfmon=%s", perfmon_enabled_str, 0),
DWARFS_OPT("perfmon_trace=%s", perfmon_trace_file_str, 0),
#endif #endif
FUSE_OPT_END}; FUSE_OPT_END};
@ -1041,6 +1043,7 @@ void usage(std::ostream& os, std::filesystem::path const& progname) {
<< " -o tidy_max_age=TIME tidy blocks after this time (10m)\n" << " -o tidy_max_age=TIME tidy blocks after this time (10m)\n"
#if DWARFS_PERFMON_ENABLED #if DWARFS_PERFMON_ENABLED
<< " -o perfmon=name[,...] enable performance monitor\n" << " -o perfmon=name[,...] enable performance monitor\n"
<< " -o perfmon_trace=FILE write performance monitor trace file\n"
#endif #endif
#ifdef DWARFS_BUILTIN_MANPAGE #ifdef DWARFS_BUILTIN_MANPAGE
<< " --man show manual page and exit\n" << " --man show manual page and exit\n"
@ -1274,15 +1277,21 @@ void load_filesystem(dwarfs_userdata& userdata) {
} }
std::unordered_set<std::string> perfmon_enabled; std::unordered_set<std::string> perfmon_enabled;
std::optional<std::filesystem::path> perfmon_trace_file;
#if DWARFS_PERFMON_ENABLED #if DWARFS_PERFMON_ENABLED
if (opts.perfmon_enabled_str) { if (opts.perfmon_enabled_str) {
folly::splitTo<std::string>( folly::splitTo<std::string>(
',', opts.perfmon_enabled_str, ',', opts.perfmon_enabled_str,
std::inserter(perfmon_enabled, perfmon_enabled.begin())); std::inserter(perfmon_enabled, perfmon_enabled.begin()));
} }
if (opts.perfmon_trace_file_str) {
perfmon_trace_file = userdata.iol.os->canonical(std::filesystem::path(
reinterpret_cast<char8_t const*>(opts.perfmon_trace_file_str)));
}
#endif #endif
userdata.perfmon = performance_monitor::create(perfmon_enabled); userdata.perfmon = performance_monitor::create(
perfmon_enabled, userdata.iol.file, perfmon_trace_file);
PERFMON_EXT_PROXY_SETUP(userdata, userdata.perfmon, "fuse") PERFMON_EXT_PROXY_SETUP(userdata, userdata.perfmon, "fuse")
PERFMON_EXT_TIMER_SETUP(userdata, op_init) PERFMON_EXT_TIMER_SETUP(userdata, op_init)

View File

@ -59,7 +59,7 @@ constexpr std::string_view kDash{"-"};
} // namespace } // namespace
int dwarfsextract_main(int argc, sys_char** argv, iolayer const& iol) { int dwarfsextract_main(int argc, sys_char** argv, iolayer const& iol) {
sys_string filesystem, output; sys_string filesystem, output, trace_file;
std::string format, cache_size_str, image_offset; std::string format, cache_size_str, image_offset;
logger_options logopts; logger_options logopts;
#if DWARFS_PERFMON_ENABLED #if DWARFS_PERFMON_ENABLED
@ -103,6 +103,9 @@ int dwarfsextract_main(int argc, sys_char** argv, iolayer const& iol) {
("perfmon", ("perfmon",
po::value<std::string>(&perfmon_str), po::value<std::string>(&perfmon_str),
"enable performance monitor") "enable performance monitor")
("perfmon-trace",
po_sys_value<sys_string>(&trace_file),
"write performance monitor trace file")
#endif #endif
; ;
// clang-format on // clang-format on
@ -152,15 +155,19 @@ int dwarfsextract_main(int argc, sys_char** argv, iolayer const& iol) {
fsopts.metadata.enable_nlink = true; fsopts.metadata.enable_nlink = true;
std::unordered_set<std::string> perfmon_enabled; std::unordered_set<std::string> perfmon_enabled;
std::optional<std::filesystem::path> perfmon_trace_file;
#if DWARFS_PERFMON_ENABLED #if DWARFS_PERFMON_ENABLED
if (!perfmon_str.empty()) { if (!perfmon_str.empty()) {
folly::splitTo<std::string>( folly::splitTo<std::string>(
',', perfmon_str, ',', perfmon_str,
std::inserter(perfmon_enabled, perfmon_enabled.begin())); std::inserter(perfmon_enabled, perfmon_enabled.begin()));
} }
if (!trace_file.empty()) {
perfmon_trace_file = iol.os->canonical(trace_file);
}
#endif #endif
std::shared_ptr<performance_monitor> perfmon = std::shared_ptr<performance_monitor> perfmon = performance_monitor::create(
performance_monitor::create(perfmon_enabled); perfmon_enabled, iol.file, perfmon_trace_file);
auto fs_path = iol.os->canonical(filesystem); auto fs_path = iol.os->canonical(filesystem);