-
Notifications
You must be signed in to change notification settings - Fork 30.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
RFC: add a flag similar to --prof, but based on v8 CPU profiler #26878
Comments
I think it's a good idea to keep a |
It would be good as a follow-up for the flag that writes the CPU profile. I can think of two ways to implement this:
Even if we go with option 1, I think this should ideally be developed in a separate repo, published to npm, before it matures and be moved here (similar to This also helps moving the v8 CPU profiler from tier 3 in our diagnostics tooling support to tier 1. cc @nodejs/v8 @nodejs/diagnostics |
This patch introduces a CLI flag --cpu-prof that starts the V8 CPU profiler on start up, and ends the profiler then writes the CPU profile before the Node.js instance (on the main thread or the worker thread) exits. By default the profile is written to `${cwd}/CPU.${yyyymmdd}.${hhmmss}.${pid}.${tid}.${seq}.cpuprofile`. The patch also introduces a --cpu-prof-path flag for the user to specify the path the profile will be written to. Fixes: nodejs#26878
This patch introduces a CLI flag --cpu-prof that starts the V8 CPU profiler on start up, and ends the profiler then writes the CPU profile before the Node.js instance (on the main thread or the worker thread) exits. By default the profile is written to `${cwd}/CPU.${yyyymmdd}.${hhmmss}.${pid}.${tid}.${seq}.cpuprofile`. The patch also introduces a --cpu-prof-path flag for the user to specify the path the profile will be written to. Fixes: nodejs#26878
This patch introduces a CLI flag --cpu-prof that starts the V8 CPU profiler on start up, and ends the profiler then writes the CPU profile before the Node.js instance (on the main thread or the worker thread) exits. By default the profile is written to `${cwd}/CPU.${yyyymmdd}.${hhmmss}.${pid}.${tid}.${seq}.cpuprofile`. The patch also introduces a --cpu-prof-path flag for the user to specify the path the profile will be written to. Refs: #26878 PR-URL: #27147 Reviewed-By: Anna Henningsen <[email protected]>
|
Hi all,
I am currently working on adding a flag similar to
--prof
but use the better-maintained v8 CPU profiler instead. Working prototype is here, which reuses the recent refactoredNODE_V8_COVERAGE
implementation (also depends on another refactor in #26874).When running
It starts the CPU profiler at start up, when the Node.js instance (main thread or worker threads) exits, it writes the CPU profile under the current working directory with the file name returned by the unified
DiagnosticFileName('CPU', 'cpuprofile')
(example:CPU.20190323.191111.95080.0.cpuprofile
).It also provides
--cpu-prof-name
for the user to specify the path where the profile will be written to (the directory of the path would be created if it does not exist yet). (we can't make that a value of--cpu-prof
because thennode --cpu-prof entry.js
would be ambiguous, or at least our current option parser does not support something smart enough to work around it).The generated CPU profile can be visualized using Chrome's dedicated DevTools for Node.js (available in
chrome://inspect
), this is much easier to use than--prof-process
for--prof
, although V8's CPU profiler is currently only capable of profiling JavaScript. However there are also discussions about including native stacks there as well (according to @psmarshall ).We may also be able to hook this into our benchmark runner to get CPU profiles for the core benchmarks.
Some questions regarding this feature:
process.argv
,process.env
), as well as preparations done before executing the entry point (e.g. running preloaded modules specified with--require
) - currently these two are mixed together but we should be able to refactor and separate them.JSON::Parse
on the message returned from the inspector protocol, and then does aJSON::Stringify
on the specific subtree (in this case,message.result.profile
). It should be fine as an initial implementation, however:v8-profile.h
)Any feedback regarding this idea is welcomed!
The text was updated successfully, but these errors were encountered: