The nodprof command can be used to:
- run a node.js module and profile the execution
- start an HTTP server used to display profiling results
A static-ish demo of nodprof is available at
http://muellerware.org/nodprof-static/
When profiling a node.js module, the profiling results will be stored in a
JSON file in a directory indicated by the nodprof configuration.
The nodprof HTTP server provides a viewer for these profiling results. You
can also use the nodprof module API to add the nodprof viewer to your own
application via middleware.
To run the server, use the --serve option. If the --serve option isn't
used then nodprof will run the remainder of the command-line as a module
invocation and profile the execution.
When profiling a module, profiling will be started,
the module will be require()d, and when process emits the exit event,
profiling will be stopped and the data written out.
sudo npm -g install nodprof
nodprof --serve --port 8081&
nodprof `which npm` info grunt
open http://localhost:8081
This will:
- install
nodprofglobally - start the
nodprofserver on port 8081 - profile
npm info grunt - open a browser to view the results
nodprof uses a configuration to determine the values of various twiddleable
values it uses. These values can be set in the following places, listed in
precedence order:
- command line options
- environment variables
- configuration file values
- default values
options specified as Boolean can be specified without a Boolean value, in which case the value is assumed to be true.
| -c --config | path | the location of the configuration file |
| -v --verbose | Boolean | be noisy |
| -x --debug | Boolean | be very noisy |
| -p --port | Number | the HTTP port when running the server |
| -d --data | path | the directory to use to read and write profiling data |
| -s --serve | Boolean | run the HTTP server |
| -h --heap | Boolean | generate a heap snapshot |
| -r --profile | Boolean | generate a profile |
| PORT | Number | the HTTP port when running the server |
The configuration file is a JSON file whose content is an object with the following properties:
| verbose | Boolean | same as --verbose |
| debug | Boolean | same as --debug |
| port | Number | same as --port |
| data | path | same as --data |
| heap | Boolean | same as --heap |
| profile | Boolean | same as --profile |
| --verbose | Boolean | false |
| --debug | Boolean | false |
| --config | path | ~/.nodprof/config.json, where ~ is the value of the USERPROFILE environment variable on windows |
| --port | Number | 3000 |
| --data | path | ~/.nodprof/data (see note on --config above) |
| --serve | Boolean | false |
| --heap | Boolean | true |
| --profile | Boolean | true |
The nodprof module provides low-level support for profiling via exported
functions. The functions return large JSON-able objects.
Start profiling. Does nothing if profiling already started.
Returns nothing.
Stop profiling. Does nothing if profiling already stopped.
Returns a ProfileResults object or null if profiling was not started.
Returns true if profiling has been started, else false.
Returns a HeapSnapshotResults object.
Returns a function which can be used as connect middleware to provide the
function of the command-line nodprof server in your application. The
url is the directory-sh uri to mount the functionality under, and defaults to
/nodprof.
The config parameter specifies a configuration object, which is the same
format as the configuration file specified above.
Example for express:
app.use("/nodprof/", nodprof.middleware())
For more detail on what the values in these objects mean, see the source at https://code.google.com/p/v8/source/browse/trunk/include/v8-profiler.h
| dateStarted: | Date | the date the profile was started |
| dateStopped: | Date | the date the profile was stopped |
| head: | ProfileNode | the first node in the profile |
| functionName: | String | the name of the function executing |
| scriptName: | String | the name of the script executing |
| lineNumber: | Number | the line number executing |
| totalTime: | Number | total amount of time take at this node |
| selfTime: | Number | the time taken by this node not including called functions |
| totalSamples: | Number | total number of samples retrieved |
| selfSamples: | Number | the numer of samples retrieved not including called functions |
| children: | [ProfileNode] | nodes called from this node |
| date: | Date | the date the heap snapshot was taken |
| root: | String | the id of the root object (a HeapNode) |
| nodes: | Object | an object whose keys are ids and values are a HeapNode |
| type: | Number | the type of node |
| name: | String | the name of the node |
| size: | Number | the size of the node |
| edges: | [HeapEdge] | the edges of the node |
| type: | Number | the type of edge |
| name: | String | the name of the edge |
| node: | String | the id of the node the edge points to |
If you want to hack on nodprof, the workflow:
- clone the git repo
- cd into the project directory
- run
make watch - edit the files in your flavorite editor
- when you save files, the code will be rebuilt, and server restarted
- generate some profiling data, view in the restarted server
Then iterate on 4, 5, and 6.