TEE-perf is a function level profiling tool for trusted execution enviroments like Intel SGX and ARM Trustzone. Our DSN'19 paper describes the tool in detail.
- >= python 3.6
How To Use
Compile the timer application under profiler/ with make
Recompile the application to be profiled with the following additional gcc flags:
You have to compile the profiler.c with scone-gcc and link the object file into the execuable
- Run the timer with the application as argument
./timer /path/to/measurment/file Size_of_measurment_file application application argument(s)
- In analyse run the main.py with the elf-file executed inside the enclave and the perf/file.
- In contrast to the normal perf tool, this tool does not sample the application but records each function call/return. This is very memory consuming. In my experience a 2GiB log file can store around 20s of execution (This was without compression. Compression reduced the record size from 40B per record to 16B.).
- If the measurment file is full the application will
SEGFAULT. Currently, this is a wanted behavior, as it is an easy way to end the application, when the measurment is over. However, I am not decided on that yet.
- Analysing the measurment file can take some time. For a full 2GiB measurment file this can be around 4 minutes on an Intel Xeon E3-1270. The analyser is mostly single threaded, therefore the single thread performance of the CPU is the limiting factor
- Analysing takes also a huge amount of memory. The mentioned 2GiB measurment file resulted in up to 20GiB of memory requirement while analysing. However, I worked to reduce the necessary amount of memory and have not test it since. Thus this number could be a lot smaller now.
profiler directory is a
test directory. Compile with:
Run in the
./timer /tmp/__measurement_shm 4k ./test/test hello world
This should result in the following output:
HERE HERE HERE HERE HERE HERE HERE HERE HERE HERE HERE HERE ./test/test hello world
After this switch to the
analyse directory and run:
python3 main.py -d container_with_scone-gdb ../profiler/test/test "dump" "/tmp/__measurement_shm"
The output should look similar to this:
835 ./tools/starter-exec.c: No such file or directory. could not find SGXPROFILERSHM enviroment variableDump enclave ELF to perf_dump Read File: /tmp/__measurement_shm build stack Get function names time percent callee_name a 3465 52.9250 print_args 1685 25.7370 aba 1381 21.0936 b 11 0.1680 main 5 0.0764
To run the analyses again you can just run:
python3 main.py dump "/tmp/__measurement_shm"
If you run the main.py with the python argument -i you can also work further on the data. Two convenience methods currently exist:
find_callers(function_name: str) count_call(function_name: str)