xref: /aosp_15_r20/external/crosvm/tools/contrib/memstats_chart/README.md (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1*bb4ee6a4SAndroid Build Coastguard Worker# memstats chart
2*bb4ee6a4SAndroid Build Coastguard Worker
3*bb4ee6a4SAndroid Build Coastguard WorkerGather and visualize memory information of each crosvm process, the guest and virtio-balllon for a
4*bb4ee6a4SAndroid Build Coastguard Workerrunning crosvm instance.
5*bb4ee6a4SAndroid Build Coastguard Worker
6*bb4ee6a4SAndroid Build Coastguard WorkerThis tool only supports Linux enviroments.
7*bb4ee6a4SAndroid Build Coastguard Worker
8*bb4ee6a4SAndroid Build Coastguard Worker![image](./sample.png)
9*bb4ee6a4SAndroid Build Coastguard Worker
10*bb4ee6a4SAndroid Build Coastguard Worker## Usage
11*bb4ee6a4SAndroid Build Coastguard Worker
12*bb4ee6a4SAndroid Build Coastguard Worker## Install dependencies
13*bb4ee6a4SAndroid Build Coastguard Worker
14*bb4ee6a4SAndroid Build Coastguard WorkerWe need to install some Python libraries for visualization.
15*bb4ee6a4SAndroid Build Coastguard Worker
16*bb4ee6a4SAndroid Build Coastguard Worker```sh
17*bb4ee6a4SAndroid Build Coastguard Worker$ pip install -r ./requirements.txt
18*bb4ee6a4SAndroid Build Coastguard Worker```
19*bb4ee6a4SAndroid Build Coastguard Worker
20*bb4ee6a4SAndroid Build Coastguard Worker## Build
21*bb4ee6a4SAndroid Build Coastguard Worker
22*bb4ee6a4SAndroid Build Coastguard WorkerBuild the tool with cargo and copy the binary to the device if necessary.
23*bb4ee6a4SAndroid Build Coastguard Worker
24*bb4ee6a4SAndroid Build Coastguard Worker```sh
25*bb4ee6a4SAndroid Build Coastguard Worker$ cd crosvm/tools/contrib/memstats_chart/
26*bb4ee6a4SAndroid Build Coastguard Worker$ cargo build --release
27*bb4ee6a4SAndroid Build Coastguard Worker# (optional) If crosvm is running on another machine, copy the binary to the machine.
28*bb4ee6a4SAndroid Build Coastguard Worker$ scp ./target/release/memstats $DUT:/your/favorite/directory/
29*bb4ee6a4SAndroid Build Coastguard Worker```
30*bb4ee6a4SAndroid Build Coastguard Worker
31*bb4ee6a4SAndroid Build Coastguard WorkerIf you want to run the binary on aarch64 while your workstation is x86, `dev_container` is useful.
32*bb4ee6a4SAndroid Build Coastguard Worker
33*bb4ee6a4SAndroid Build Coastguard Worker```sh
34*bb4ee6a4SAndroid Build Coastguard Worker$ ${CROSVM_PATH}/tools/dev_container
35*bb4ee6a4SAndroid Build Coastguard Worker(container)$ cd tools/contrib/memstats_chart
36*bb4ee6a4SAndroid Build Coastguard Worker(container)$ cargo build --target aarch64-unknown-linux-gnu
37*bb4ee6a4SAndroid Build Coastguard Worker(container)$ cp /scratch/cargo_target/aarch64-unknown-linux-gnu/debug/memstats
38*bb4ee6a4SAndroid Build Coastguard Worker```
39*bb4ee6a4SAndroid Build Coastguard Worker
40*bb4ee6a4SAndroid Build Coastguard Worker### Collect data
41*bb4ee6a4SAndroid Build Coastguard Worker
42*bb4ee6a4SAndroid Build Coastguard WorkerRun the binary. Note that this tool is assuming that only one crosvm is running on the system. If
43*bb4ee6a4SAndroid Build Coastguard Workerthere are multiple crosvm instances running, this tool will abort.
44*bb4ee6a4SAndroid Build Coastguard Worker
45*bb4ee6a4SAndroid Build Coastguard Worker```sh
46*bb4ee6a4SAndroid Build Coastguard Worker$ ./memstats --output memory-data.json
47*bb4ee6a4SAndroid Build Coastguard Worker# Press Ctrl-C to stop collecting data
48*bb4ee6a4SAndroid Build Coastguard Worker```
49*bb4ee6a4SAndroid Build Coastguard Worker
50*bb4ee6a4SAndroid Build Coastguard Worker### Visualize the data
51*bb4ee6a4SAndroid Build Coastguard Worker
52*bb4ee6a4SAndroid Build Coastguard WorkerVisualize the obtained JSON file with `plot.py`.
53*bb4ee6a4SAndroid Build Coastguard Worker
54*bb4ee6a4SAndroid Build Coastguard Worker```sh
55*bb4ee6a4SAndroid Build Coastguard Worker$ python3 plot.py -i ./memory-data.json
56*bb4ee6a4SAndroid Build Coastguard Worker./memory-data.html is written
57*bb4ee6a4SAndroid Build Coastguard Worker$ google-chrome ./memory-data.html
58*bb4ee6a4SAndroid Build Coastguard Worker```
59*bb4ee6a4SAndroid Build Coastguard Worker
60*bb4ee6a4SAndroid Build Coastguard Worker#### How to interpret the graph
61*bb4ee6a4SAndroid Build Coastguard Worker
62*bb4ee6a4SAndroid Build Coastguard Worker##### crosvm process
63*bb4ee6a4SAndroid Build Coastguard Worker
64*bb4ee6a4SAndroid Build Coastguard WorkerThe main process's memory usage is divided into the following five sections and shown:
65*bb4ee6a4SAndroid Build Coastguard Worker
66*bb4ee6a4SAndroid Build Coastguard Worker- crosvm (guest disk caches)
67*bb4ee6a4SAndroid Build Coastguard Worker- crosvm (guest shared memory)
68*bb4ee6a4SAndroid Build Coastguard Worker- crosvm (guest unevictable)
69*bb4ee6a4SAndroid Build Coastguard Worker- crosvm (guest used)
70*bb4ee6a4SAndroid Build Coastguard Worker- crosvm (host)
71*bb4ee6a4SAndroid Build Coastguard Worker
72*bb4ee6a4SAndroid Build Coastguard WorkerThese values are computed by the process's RSS and virtio-balloon's statistics.
73*bb4ee6a4SAndroid Build Coastguard Worker
74*bb4ee6a4SAndroid Build Coastguard Worker##### Other processes
75*bb4ee6a4SAndroid Build Coastguard Worker
76*bb4ee6a4SAndroid Build Coastguard WorkerFor processes other than the main one, `Private_Dirty` in `/proc/${PID}/smaps` is shown. Unlike
77*bb4ee6a4SAndroid Build Coastguard Worker`Pss`, `Private_Dirty` doesn't include the shared memory for the guest physical memory region that
78*bb4ee6a4SAndroid Build Coastguard Workerthe process touched. We use this value because such shared memory regions are counted as a part of
79*bb4ee6a4SAndroid Build Coastguard Workerthe crosvm main process's memory usage.
80*bb4ee6a4SAndroid Build Coastguard Worker
81*bb4ee6a4SAndroid Build Coastguard Worker##### Balloon
82*bb4ee6a4SAndroid Build Coastguard Worker
83*bb4ee6a4SAndroid Build Coastguard WorkerThe blue line is the upper bound of the guest's memory usage limited by virtio-balloon.
84