| # Perfetto Stress Test |
| |
| This is a test harness that to stress test the client library (DataSource-level |
| only for now). |
| |
| The test is based on a number of configs in /test/stress_test/configs/*.cfg |
| (NOTE: they must be listed in configs/BUILD.gn). |
| The config is a /protos/perfetto/config/stress_test_config.proto message, which |
| embeds the configuration of the test and a whole trace config. |
| |
| Each configs defines a testing scenario, determining the general trace config |
| and all the settings of the test (e.g., how many producer processes to spawn, |
| the write timings). |
| |
| The test is based on exec()-ing `traced` (the tracing service), `perfetto` (the |
| consumer cmdline client) and a variable number of `stress_producer` instances. |
| |
| `stress_producer` emits events at a configurable rate, writing predictable |
| sequences of numbers / string, so that the test harness can easily detect |
| corruptions, out-of-order events or gaps. |
| |
| After running each test, the `stress_test` binary reads back the trace and |
| performs a bunch of checks: |
| |
| - Checks that the number of sequences is exactly equal to #processes x #threads. |
| - Checks that each sequence has all the expected packets in the right sequence |
| - Checks the payload and correctness of proto nesting of each trace packet. |
| - Reports CPU/Memory/Context-switch numbers for the service and producer |
| processes. |
| |
| Each test config is isolated from the others. All processes are killed and |
| re-spawned for each test. |
| |
| The stdout/err of each process is saved in a dedicated /tmp/ folder, as well as |
| the resulting trace. |
| |
| ## Building and running the test |
| |
| ```bash |
| # This will recursively build traced, perfetto and stress_producer. |
| ninja -C out/default stress_test |
| |
| out/default/stress_test |
| ``` |
| |
| will output: |
| |
| ```txt |
| [307.909] stress_test.cc:116 Saving test results in /tmp/perfetto-ltIBJgA0 |
| |
| =============================================================== |
| Config: simple |
| =============================================================== |
| Metric Expected Actual |
| ------ -------- ------ |
| #Errors 0 0 |
| Duration [ms] 3000 3109 |
| Num threads 1 1 |
| Num packets 1000 1001 |
| Trace size [KB] 168 170 |
| Svc RSS [MB] 4 2 |
| Prod RSS [MB] --- 1 |
| Svc CPU [ms] --- 10 |
| Prod CPU [ms] --- 32 |
| Svc #ctxswitch --- 103 / 20 |
| Prod #ctxswitch --- 1022 / 1 |
| |
| =============================================================== |
| Config: bursts |
| =============================================================== |
| Metric Expected Actual |
| ------ -------- ------ |
| #Errors 0 0 |
| Duration [ms] 2000 2381 |
| Num threads 10 10 |
| Num packets 2675 20021 |
| Trace size [KB] 449 11063 |
| Svc RSS [MB] 32 17 |
| Prod RSS [MB] --- 1 |
| Svc CPU [ms] --- 98 |
| Prod CPU [ms] --- 17 |
| Svc #ctxswitch --- 704 / 1327 |
| Prod #ctxswitch --- 421 / 1 |
| ``` |
| |
| ```bash |
| $ ls -Rlh /tmp/perfetto-ltIBJgA0 |
| total 0 |
| drwxr-xr-x 16 primiano wheel 512B 5 Aug 09:16 bursts |
| drwxr-xr-x 9 primiano wheel 288B 5 Aug 09:16 simple |
| drwxr-xr-x 38 primiano wheel 1.2K 5 Aug 09:16 the_storm |
| |
| /tmp/perfetto-ltIBJgA0/bursts: |
| total 22752 |
| -rw-r--r-- 1 primiano wheel 0B 5 Aug 09:16 errors.log |
| -rw-r--r-- 1 primiano wheel 180B 5 Aug 09:16 perfetto.log |
| -rw-r--r-- 1 primiano wheel 441B 5 Aug 09:16 producer.0.log |
| ... |
| -rw-r--r-- 1 primiano wheel 441B 5 Aug 09:16 producer.9.log |
| -rw------- 1 primiano wheel 11M 5 Aug 09:16 trace |
| -rw-r--r-- 1 primiano wheel 407B 5 Aug 09:16 traced.log |
| |
| /tmp/perfetto-ltIBJgA0/simple: |
| total 400 |
| srwxr-xr-x 1 primiano wheel 0B 5 Aug 09:16 consumer.sock |
| -rw-r--r-- 1 primiano wheel 0B 5 Aug 09:16 errors.log |
| -rw-r--r-- 1 primiano wheel 178B 5 Aug 09:16 perfetto.log |
| -rw-r--r-- 1 primiano wheel 0B 5 Aug 09:16 producer.0.log |
| srwxr-xr-x 1 primiano wheel 0B 5 Aug 09:16 producer.sock |
| -rw------- 1 primiano wheel 167K 5 Aug 09:16 trace |
| -rw-r--r-- 1 primiano wheel 406B 5 Aug 09:16 traced.log |
| |
| /tmp/perfetto-ltIBJgA0/the_storm: |
| total 524432 |
| -rw-r--r-- 1 primiano wheel 0B 5 Aug 09:16 errors.log |
| -rw-r--r-- 1 primiano wheel 184B 5 Aug 09:16 perfetto.log |
| -rw-r--r-- 1 primiano wheel 0B 5 Aug 09:16 producer.0.log |
| ... |
| -rw-r--r-- 1 primiano wheel 0B 5 Aug 09:16 producer.127.log |
| -rw------- 1 primiano wheel 248M 5 Aug 09:16 trace |
| -rw-r--r-- 1 primiano wheel 408B 5 Aug 09:16 traced.log |
| ``` |
| |
| ## TODOs |
| |
| The following scenarios requires more coverage: |
| |
| - Nested messages. |
| - Force losses and check that the last_dropped flag is consistent. |
| - Flushes and scraping. |
| - Report data losses in the test output. |
| - Multibuffer scenarios. |
| - write_into_file=true. |
| - Vary page size, smb size. |