Today at the #ukoug_tech14 I had the chance to attend to the Christo Kutrovky's session @kutrovsky (Pythian) about "Measuring Performance in Oracle Solaris & Oracle Linux". This session aimed to present how to measure system utilization in the Linux and Oracle Solaris operating systems and how to use these information for tuning and capacity planning. During this session we had a very good introduction to a bunch of performance monitoring tools that can be categorized in four categories (non exhaustive list of tool):
1. CPU:
- top
- vmstat
- time
- mpstat
2. Memory - RAM
2.1 Global
- /proc/meminfo
- vmstat
- ipcs
2.2 Per process
- -pmap -x
3. Disk
- vmstat
- iostat
- iotop
- dtrace
4. Network
- ifconfig
- netstat
- nicstat
- iftop
- iperf
- tcpdump
Regarding this list, I would like to point out a specific command which could be useful in the context of a performance test. This command is taskset. According to Manual page of taskset: taskset is used to set or retrieve the CPU affinity of a running process given its PID or to launch a new COMMAND with a given CPU affinity. CPU affinity is a scheduler property that "bonds" a process to a given set of CPUs on the system. The Linux scheduler will honor the given CPU affinity and the process will not run on any other CPUs.
Let's try to make a short test, with sysbench and mysql in order to see how taskset works. This test consists of running sysbench with 4096 threads, the first time without taskset and a second time with taskset by setting CPU affinity on CPU number 3.
1. Sysbench test without CPU affinity
1.1 Let's tart the benchmark with sysbench
mysql@ThinkPad-T540p:/home/mysql/ [mysqld1]
./innodb/runallinnodb5.ksh
1.2 In order to proove that sysbench is running 4096 threads we can execute "top + C":
22110 mysql 20 0
4747720 334964 1548 S 5,3
2,1 0:06.55 sysbench --db-driver mysql --test oltp
--num-threads 4096 --mysql-user sbtest --mysql-password sbtest
--mysql-db sysbench .....
1.3 Let's now have a look on CPU usage with command "top + 1":
top - 11:47:38 up 42 min, 4 users, load
average: 5,97, 15,54, 16,48
Tasks: 238 total, 2 running, 236
sleeping, 0 stopped, 0 zombie
%Cpu0 : 25,5 us, 1,7 sy, 0,0 ni, 69,9 id,
3,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu1 : 15,1 us, 0,7 sy, 0,0 ni, 78,9 id,
5,4 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu2 : 21,3 us, 1,3 sy, 0,0 ni, 77,4 id,
0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu3 : 15,8 us, 1,0 sy, 0,0 ni, 83,2 id,
0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu4 : 18,6 us, 1,3 sy, 0,0 ni, 79,8 id,
0,3 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu5 : 15,4 us, 1,0 sy, 0,0 ni, 83,7 id,
0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu6 : 27,8 us, 1,0 sy, 0,0 ni, 71,2 id,
0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu7 : 14,8 us, 0,0 sy, 0,0 ni, 85,2 id,
0,0 wa, 0,0 hi, 0,0 si, 0,0 st
KiB Mem: 16309072 total, 4207804 used, 12101268
free, 206348 buffers
KiB Swap: 16651260
total, 0 used, 16651260
free. 1628872 cached Mem
1.4 As we could expect all CPUs are in use because no CPU affinity has been set:
steulet@ThinkPad-T540p:~$ sudo taskset -pc
22110
pid 21767's current affinity list: 0-7
2. Sysbench test with CPU affinity
2.1 Let's start by setting CPU Affinity of mysql process:
steulet@ThinkPad-T540p:~$ sudo taskset -pc 3
22110
pid 22110's current affinity list: 0-7
pid 22110's new affinity list: 3
2.2 We can now restart the benchmark:
mysql@ThinkPad-T540p:/home/mysql/ [mysqld1]
./innodb/runallinnodb5.ksh
2.3 Let's now have a look on CPU usage using command "top + 1":
Tasks: 240 total, 2 running, 238
sleeping, 0 stopped, 0 zombie
%Cpu0 : 1,7 us, 0,3 sy, 0,0 ni, 97,7
id, 0,0 wa, 0,0 hi, 0,3 si, 0,0 st
%Cpu1 : 0,3 us, 0,0 sy, 0,0 ni, 99,7
id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu2 : 0,3 us, 0,0 sy, 0,0 ni, 99,7
id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu3 : 98,0 us,
1,7 sy, 0,0 ni, 0,3 id, 0,0 wa, 0,0
hi, 0,0 si, 0,0 st
%Cpu4 : 2,0 us, 0,3 sy, 0,0 ni, 97,3
id, 0,3 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu5 : 0,7 us, 0,0 sy, 0,0 ni, 99,3
id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu6 : 0,3 us, 0,7 sy, 0,0 ni, 97,7
id, 1,3 wa, 0,0 hi, 0,0 si, 0,0 st
%Cpu7 : 0,7 us, 0,0 sy, 0,0 ni, 95,7
id, 3,7 wa, 0,0 hi, 0,0 si, 0,0 st
The processor 3 own all the mysql load as expected. Thanks to taskset you can also have a better understanding of HiperThreaded CPUs load. In order to better understand the problems related to the monitoring of Hyperthreaded CPU and CPU affinity, I suggest you to read the following blog: http://www.pythian.com/blog/virtual-cpus-with-amazon-web-services/