passt/test/memory/passt
Stefano Brivio 40fc9e6e7b test: Add memory/passt test cases
These show a summary of memory usage in kernel and userspace with
different port forwarding configurations, details of userspace usage
using 'nm' (passt only uses statically allocated memory), and details
of kernel memory from slab reporting facilities.

This adds a new test image, mbuto.mem.img, with harcoded IPv4 and
IPv6 addresses and routes, and just the tools we need to start and
stop passt, to report from /proc/slabinfo, /proc/meminfo, and to
print and parse symbol sizes using nm(1).

passt can't pivot_root() for sandboxing purposes on ramfs, so we need
to create another filesystem and chroot into it, first.

We don't want to use pane context functions, as we're checking memory
usage for sockets: resort to screen-scraping.

Configure a dummy interface to provide passt with an appearance of
working IPv4 and IPv6 connectivity, contributed by David.

Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
2022-11-04 12:01:27 +01:00

187 lines
4.1 KiB
Text

# SPDX-License-Identifier: AGPL-3.0-or-later
#
# PASST - Plug A Simple Socket Transport
# for qemu/UNIX domain socket mode
#
# PASTA - Pack A Subtle Tap Abstraction
# for network namespace/tap device mode
#
# test/memory/passt - Show memory usage of passt in kernel and userspace
#
# Copyright (c) 2022 Red Hat GmbH
# Author: Stefano Brivio <sbrivio@redhat.com>
gtools sed cat diff nm sort kill tee head tail chroot unshare mount mkdir cp
def meminfo_row
gout DIFF meminfo_diff /tmp/meminfo.before /tmp/meminfo.after __WHAT__
tl __NAME__
td __DIFF__ 3 0 0
endef
def meminfo_reverse_row
gout DIFF meminfo_diff /tmp/meminfo.after /tmp/meminfo.before __WHAT__
tl __NAME__
td __DIFF__ 3 0 0
endef
def nm_row
gout SIZE nm_size /tmp/nm.size __WHAT__
tl __WHAT__
td __SIZE__ 6 0 0
endef
def slab_row
gout COUNT slab_diff_count /tmp/slabinfo.before /tmp/slabinfo.after __WHAT__
gout SIZE slab_size /tmp/slabinfo.before __WHAT__
gout DIFF slab_diff_size /tmp/slabinfo.before /tmp/slabinfo.after __WHAT__
tl __WHAT__
td __COUNT__ 0 0 0
td __SIZE__ 0 0 0
td __DIFF__ 6 0 0
endef
def start_stop_diff
guest sed /proc/slabinfo -ne 's/^\([^ ]* *[^ ]* *[^ ]* *[^ ]*\).*/\\\1/p' > /tmp/slabinfo.before
guest cat /proc/meminfo > /tmp/meminfo.before
guest /usr/bin/passt.avx2 -l /tmp/log -s /tmp/sock -P /tmp/pid __OPTS__ --netns-only
sleep 2
guest cat /proc/meminfo > /tmp/meminfo.after
guest sed /proc/slabinfo -ne 's/^\([^ ]* *[^ ]* *[^ ]* *[^ ]*\).*/\\\1/p' > /tmp/slabinfo.after
guest kill \$(cat /tmp/pid)
guest diff -y --suppress-common-lines /tmp/meminfo.before /tmp/meminfo.after || :
guest nm -td -Sr --size-sort -P /usr/bin/passt.avx2 | head -30 | tee /tmp/nm.size
guest sed /proc/slabinfo -ne 's/\(.*<objsize>\).*$/\1/p' | tail -1; (diff -y --suppress-common-lines /tmp/slabinfo.before /tmp/slabinfo.after | sort -grk8)
endef
def summary
info Memory usage summary
info
th type MiB
set WHAT MemFree
set NAME used
meminfo_reverse_row
set WHAT AnonPages
set NAME userspace
meminfo_row
set WHAT Slab
set NAME kernel
meminfo_row
te
endef
guest mkdir /test
guest mount -t tmpfs none /test
guest mkdir /test/proc /test/dev /test/tmp
guest mount -o bind /proc /test/proc
guest mount -o bind /dev /test/dev
guest cp -Lr /bin /lib /lib64 /usr /sbin /test/
guest ulimit -Hn 300000
guest unshare -rUm -R /test
guest chroot .
guest meminfo_size() { grep "^$2:" $1 | tr -s ' ' | cut -f2 -d ' '; }
guest meminfo_diff() { echo $(( $(meminfo_size $2 $3) - $(meminfo_size $1 $3) )); }
guest nm_size() { grep -m1 "^$2 " $1 | cut -f4 -d ' '; }
guest slab_count() { grep "^$2 " $1 | tr -s ' ' | cut -f3 -d ' '; }
guest slab_size() { grep "^$2 " $1 | tr -s ' ' | cut -f4 -d ' '; }
guest slab_diff_count() { echo $(( $(slab_count $2 $3) - $(slab_count $1 $3) )); }
guest slab_diff_size() { echo $(( $(slab_count $2 $3) * $(slab_size $2 $3) - $(slab_count $1 $3) * $(slab_size $1 $3) )); }
test Memory usage: all TCP and UDP ports forwarded, IPv4 and IPv6
set OPTS -t all -u all
start_stop_diff
summary
info Userspace memory detail
info
th symbol MiB
set WHAT tcp_buf_discard
nm_row
set WHAT tcp6_l2_buf
nm_row
set WHAT tcp4_l2_buf
nm_row
set WHAT tc
nm_row
set WHAT pkt_buf
nm_row
set WHAT udp_splice_map
nm_row
set WHAT udp6_l2_buf
nm_row
set WHAT udp4_l2_buf
nm_row
set WHAT udp_tap_map
nm_row
set WHAT icmp_id_map
nm_row
set WHAT udp_splice_buf
nm_row
set WHAT tc_hash
nm_row
set WHAT pool_tap6_storage
nm_row
set WHAT pool_tap4_storage
nm_row
set WHAT tap6_l4
nm_row
set WHAT tap4_l4
nm_row
te
info Kernel memory detail
info
th objects count size MiB
set WHAT pid
slab_row
set WHAT dentry
slab_row
set WHAT Acpi-Parse
slab_row
set WHAT kmalloc-64
slab_row
set WHAT kmalloc-32
slab_row
set WHAT lsm_file_cache
slab_row
set WHAT filp
slab_row
set WHAT anon_vma_chain
slab_row
set WHAT ep_head
slab_row
set WHAT sock_inode_cache
slab_row
set WHAT signal_cache
slab_row
set WHAT TCPv6
slab_row
set WHAT TCP
slab_row
set WHAT UDPv6
slab_row
te
test Memory usage: all TCP ports forwarded, IPv4
set OPTS -t all -4
start_stop_diff
summary
test Memory usage: all TCP and UDP ports forwarded, IPv4
set OPTS -t all -u all -4
start_stop_diff
summary
test Memory usage: no ports forwarded
set OPTS -t none -u none
start_stop_diff
summary