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 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