docs/Profiler.html
Taskflow comes with a built-in profiler, TFProf, for you to profile and visualize taskflow programs.
All taskflow programs come with a lightweight profiling module to observer worker activities in every executor. To enable the profiler, set the environment variable TF_ENABLE_PROFILER to a file name in which the profiling result will be stored.
~$TF\_ENABLE\_PROFILER=result.json ./my_taskflow
~$ cat result.json[{"executor":"0","data":[{"worker":12,"level":0,"data":[{"span":[72,117],"name":"12\_0","type":"static"},{"span":[121,123],"name":"12\_1","type":"static"},{"span":[123,125],"name":"12\_2","type":"static"},{"span":[125,127],"name":"12\_3","type":"static"}]}]}]
When the program finishes, it generates and saves the profiling data to result.json in JavaScript Object Notation (JSON) format. You can then paste the JSON data to our web-based interface, Taskflow Profiler, to visualize the execution timelines of tasks and workers. The web interface supports the following features:
TFProf implements a clustering-based algorithm to efficiently visualize tasks and their execution timelines in a browser. Without losing much visual accuracy, each clustered task indicates a group of adjacent tasks clustered by the algorithm, and you can zoom in to see these tasks.
When profiling large taskflow programs, the method in the previous section may not work because of the limitation of processing large JSON files. For example, a taskflow program of a million tasks can produce several GBs of profiling data, and the profile may respond to your requests very slowly. To solve this problem, we have implemented a C++-based http server optimized for our profiling data. To compile the server, enable the cmake option TF_BUILD_PROFILER. You may visit Building and Installing to understand Taskflow's build environment.
# under the build directory~$ cmake ../ -DTF_BUILD_PROFILER=ON
~$ make
After successfully compiling the server, you can find the executable at tfprof/server/tfprof. Now, generate profiling data from running a taskflow program but specify the output file with extension .tfp.
~$TF\_ENABLE\_PROFILER=my_taskflow.tfp ./my_taskflow
~$ ls
my_taskflow.tfp# my\_taskflow.tfp is of binary format
Launch the server program tfprof/server/tfprof and pass (1) the directory of index.html (default at tfprof/) via the option –mount and (2) the my_taskflow.tfp via the option –input.
# under the build/ directory~$ ./tfprof/server/tfprof --mount ../tfprof/ --input my_taskflow.tfp
Now, open your favorite browser at localhost:8080 to visualize and profile your my_taskflow program.
The compiled profiler is a more powerful version than the pure JavaScript-based interface and it is able to more efficiently handle large profiling data under different queries. We currently support the following two view types:
You can display a profile summary by specifying only the environment variable TF_ENABLE_PROFILER without any value. The Taskflow will generate a separate summary report of tasks and workers for each executor created by the program.
# enable the environment variable without any value~$TF\_ENABLE\_PROFILER=./my_taskflow_program# your program output...
...
...# Taskflow profile summary==Observer0:1workers completed18tasksin28us
-Task- Count Time(us)Avg(us)Min(us)Max(us)static750.71428604condition1100.00000000-Worker- Level Task Count Time(us)Avg(us)Min(us)Max(us)140static750.71428604condition1100.000000001850.27777804
The report consists of two sections, task summary and worker summary. In the first section, the summary reports for each task type the number of executions (Count), the total execution time (Time), average execution time per task (Avg), and the minimum (Min) and the maximum (Max) execution time among all tasks. Similarly in the second section, the summary reports for each worker the task execution statistics.