Overview
In this section we study some tools to monitor system resources on the Linux system.top
The "top" utility shows some general information about resources on the system and information about processes. We run the utility with the command "top" and a display shows up. A sample run on the hills server looks like:top - 09:28:35 up 13 days, 19:41, 5 users, load average: 0.08, 0.02, 0.01 Tasks: 337 total, 1 running, 336 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.2 us, 0.1 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.1 hi, 0.0 si, 0.0 st MiB Mem : 11697.6 total, 2661.2 free, 1465.5 used, 7570.9 buff/cache MiB Swap: 8192.0 total, 8156.8 free, 35.2 used. 9627.2 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1260391 mcruzmur 20 0 17.9g 61064 27472 S 0.3 0.5 14:17.26 zellij 3041836 amittal 20 0 54640 4800 3768 R 0.3 0.0 0:00.02 top 1 root 20 0 247312 10912 8044 S 0.0 0.1 1:51.59 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.35 kthreadd 3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp 4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par+ 5 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 slub_fl+ 7 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker+ 10 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_perc+ 11 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_tas+ 12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_tas+ 13 root 20 0 0 0 0 S 0.0 0.0 0:02.69 ksoftir+ 14 root 20 0 0 0 0 I 0.0 0.0 2:23.91 rcu_sch+ 15 root rt 0 0 0 0 S 0.0 0.0 0:00.18 migrati+We can exit the top display by hitting the 'q' key.Let us examine the output in more detail.
top - 09:28:35 up 13 days, 19:41, 5 users, load average: 0.08, 0.02, 0.01 The first line shows the current time and how long the system has been up.The number of users that are logged in is shown in the next field followed by the load average for 1 minute, 5 minute and 15 minute intervals. The load average is the number of processes that are running or waiting to run on the CPU. It shows how busy the system is. If we assume 1 core then a value of 0 means that no processes are using the CPU. If the load average is 1 then the system is being fully utilized. If the load average is 2.0 ( again with 1 core ) then the system is overloaded and some processes are waiting for the CPU. The values depend on the number of cores. The load average is not a value that must stay between 0 and 1. It depends on the numbe of cores. If the number of cores is say, 4 then the load average might be 2 and that means the CPU is not overloaded but has some load. We can find out the number of cores using the "lscpu" command. Running this on the hills server produces the following output. [amittal@hills ~]$ lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 4 On-line CPU(s) list: 0-3 Thread(s) per core: 1 Core(s) per socket: 2 Socket(s): 2 NUMA node(s): 1 Vendor ID: GenuineIntel CPU family: 6 Model: 85 Model name: Intel(R) Xeon(R) Gold 6326 CPU @ 2.90GHz Stepping: 7 Let's review some of the CPU concepts. The number of cores is 4 for the hills server in the above output. A socket is a physical slot on the motherboard. From the above output we have 2 sockets on the motherboard. A socket can have cores. A core is like a CPU in that it can execute instructions independently. If there are 2 cores in a single socket then they can share the cache. There is also the concept of logical processor or hyperhteading. It doesn't apply in the above case of the hills server but it's basically a core that support the storage of instructions for 2 or more threads. This make execution of 2 threads slightly faster than a normal core however the core by itself is only executiing a single instruction at a time. The next line in the top output is: Tasks: 337 total, 1 running, 336 sleeping, 0 stopped, 0 zombie The 337 refers to processes. A stopped process is a process that receives a STOP signal and will resume when it receives CONT signal. As an example we start a process using the sleep command. [amittal@fog ~]$ sleep 120 ^Z [1]+ Stopped sleep 120 [amittal@fog ~]$ ps aux | grep sleep amittal 57737 0.0 0.0 108056 356 pts/0 T 09:57 0:00 sleep 120 amittal 57747 0.0 0.0 112816 980 pts/0 S+ 09:58 0:00 grep --color=auto sleep [amittal@fog ~]$ We use Ctrl-Z to send the "STOP" signal. We see that the state is "T" which means stopped state. To resume the process we can type the "fg" command. [amittal@fog ~]$ fg sleep 60 [amittal@fog ~]$ ps aux | grep sleep amittal 55316 0.0 0.0 112816 984 pts/0 S+ 09:09 0:00 grep --color=auto sleep [amittal@fog ~]$ We will cover what a zombie process is in the processors section. The next line gives us some information %Cpu(s): 0.2 us, 0.1 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.1 hi, 0.0 si, 0.0 st us -- percentage of time running user processes sy -- percent of time spent running the kernel. ni -- percent of time spent running processes with manually configured nice values. id -- percent of time idle (if low, CPU may be overworked). wa -- percent of wait time (if high, CPU is waiting for I/O access). hi -- percent of time managing hardware interrupts. si -- percent of time managing software interrupts. st -- percent of virtual CPU time waiting for access to physical CPU. This has to do with vmware installed on the operating system. These values will refresh every few seconds. The next 2 lines deal with memory. MiB Mem : 11697.6 total, 2661.2 free, 1465.5 used, 7570.9 buff/cache MiB Swap: 8192.0 total, 8156.8 free, 35.2 used. 9627.2 avail Mem The line for Mem actually contains the last value from the second line. The Swap line only has the first 3 values and then ends with the dot. We can use the Shift-E key to change the memory units. The below shows the units in Kilo Bits. %Cpu(s): 0.4 us, 0.2 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.1 hi, 0.0 si, 0.0 st KiB Mem : 11978356 total, 1478968 free, 1723136 used, 8776252 buff/cache KiB Swap: 8388604 total, 8355116 free, 33488 used. 9578488 avail Mem From the above we have around 12 Gb RAM on the hills server. Around 1.7 Gb is used and 8.7 Gb is used for the buff/cache while 9.5 Gb is available. If the buff/cache is using roughly 8.7 Gb and the total memory is 11.9 Gb then how could we possibly have 9.5 Gb for avail memory. The available memory means how much memory the system could allocate without doing swapping. And it can use the memory of the buff/cache also if need be. The swap memory is easier to understand; the total memory is the sum of the free and used memory. Next we have the processes sorted by the CPU being consumed by the process: PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1260391 mcruzmur 20 0 17.9g 61064 27472 S 0.3 0.5 14:17.26 zellij 3041836 amittal 20 0 54640 4800 3768 R 0.3 0.0 0:00.02 top PR Priority NI If the nice command was used to start it. VIRT How much virtual memory is being used. RES How much of the RAM is being used. SHR Shared memory. Not all of it may be in the resident memory. Some of it ma be in the swapped memory. S represents the state. 'D' = uninterruptible sleep 'R' = running 'S' = sleeping 'T' = traced or stopped 'Z' = zombie CPU Percentage of the CPU being used. By default this is for a single CPU but we can use the Sfit-I command. MEM Percentage of memory consumed by the process. The "top" has some options when starting the program and it also has some interactive options while the program is running. Command line options -u: Displays processes associated with a specific user. top -u amittal [amittal@hills ~]$ top -u amittal top - 22:50:39 up 16 days, 9:03, 1 user, load average: 0.00, 0.00, 0.00 Tasks: 325 total, 2 running, 323 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.4 us, 0.1 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.1 hi, 0.1 si, 0.0 st MiB Mem : 11697.6 total, 1458.1 free, 1668.9 used, 8570.6 buff/cache MiB Swap: 8192.0 total, 8159.3 free, 32.7 used. 9367.9 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 3136993 amittal 20 0 89680 9772 8304 S 0.0 0.1 0:00.26 systemd 3136996 amittal 20 0 308992 3308 4 S 0.0 0.0 0:00.00 (sd-pam) 3137008 amittal 20 0 138976 6272 4944 S 0.0 0.1 0:00.03 sshd 3137009 amittal 20 0 29444 4816 4288 S 0.0 0.0 0:00.00 sftp-se+ 3137035 amittal 20 0 138976 5612 4284 S 0.0 0.0 0:00.06 sshd 3137036 amittal 20 0 17000 5652 3228 S 0.0 0.0 0:00.01 bash 3167303 amittal 20 0 54536 4636 3740 R 0.0 0.0 0:00.02 top -i: Displays only idle processes. [amittal@hills ~]$ top -i top - 06:14:08 up 16 days, 16:26, 2 users, load average: 0.00, 0.00, 0.00 Tasks: 326 total, 1 running, 325 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.3 us, 0.1 sy, 0.0 ni, 99.5 id, 0.0 wa, 0.1 hi, 0.0 si, 0.0 st MiB Mem : 11697.6 total, 1440.2 free, 1642.2 used, 8615.2 buff/cache MiB Swap: 8192.0 total, 8159.3 free, 32.7 used. 9386.6 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1207 root 20 0 410636 29220 13164 S 0.3 0.2 20:30.08 tuned 2103 apache 20 0 2774684 27208 8764 S 0.3 0.2 3:00.88 httpd 1260391 mcruzmur 20 0 17.9g 61712 27608 S 0.3 0.5 21:28.75 zellij 3098460 mcruzmur 20 0 17.6g 59812 27056 S 0.3 0.5 4:55.50 zellij 3156046 mcruzmur 20 0 17.6g 54860 27660 S 0.3 0.5 2:12.35 zellij 3156509 mcruzmur 20 0 17.6g 57540 27764 S 0.3 0.5 2:11.20 zellij 3192208 root 20 0 0 0 0 I 0.3 0.0 0:00.09 kworker+ 3192235 amittal 20 0 54536 4552 3660 R 0.3 0.0 0:00.04 top -d: Sets the update interval in seconds. [amittal@hills ~]$ top -d 10 -n: Limits the number of iterations before top exits. -w: Adjusts the output width. -1: Toggles single-CPU view. [amittal@hills ~]$ top -version procps-ng 3.3.15 Usage: top -hv | -bcEHiOSs1 -d secs -n max -u|U user -p pid(s) -o field -w [cols] [amittal@hills ~]$ Interactive Options We can also type the 'h' key to view all the interactive options. Shift+L: Allows searching for processes by name. k: Allows killing a process by its process ID. Shift+p: Sorts processes by CPU usage. Shift+m: Sorts processes by memory usage. Shift+t: Sorts processes by running time. Shift+n: Sorts processes by process ID. Exercise: 1)Start a process: sleep 120 & Start the top utility . Do Shift-L to see the process by typing in "sleep" . Find the process id in the display and kill the process using the 'k' key.
netstat
The tool "netstat" can be used to view network activity.[amittal@hills ~]$ netstat Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 hills.ccsf.edu:ssh 99-7-60-213.light:64431 ESTABLISHED tcp 0 0 hills.ccsf.edu:53292 server-216-137-39:https TIME_WAIT tcp 0 0 hills.ccsf.edu:ssh 76-237-102-216.li:36978 ESTABLISHED tcpThe first is the connection from the Putty to the hills server. We can check that because 99.7.60.213 is the public IP address of my modem. If we open a browser window and type in what's my ip v4 address then we can find the public ip address.
Some more netstat option examples: List all active connections. [amittal@hills ~]$ netstat -at Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 localhost:smux 0.0.0.0:* LISTEN tcp 0 0 localhost:36777 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:http 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:https 0.0.0.0:* LISTEN tcp 0 0 hills.ccsf.edu:ssh 99-7-60-213.light:64431 ESTABLISHED List the routing tables. [amittal@hills ~]$ netstat -rn Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 0.0.0.0 147.144.1.1 0.0.0.0 UG 0 0 0 ens192 147.144.1.0 0.0.0.0 255.255.255.0 U 0 0 0 ens192 [amittal@hills ~]$
ifconfig
The tool "ifconfig"[amittal@hills ~]$ ifconfig ens192: flags=4163mtu 1500 inet 147.144.1.2 netmask 255.255.255.0 broadcast 147.144.1.255 ether 00:50:56:89:aa:f8 txqueuelen 1000 (Ethernet) RX packets 12137944 bytes 9068451651 (8.4 GiB) RX errors 0 dropped 568 overruns 0 frame 0 TX packets 10067329 bytes 6173706483 (5.7 GiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73 mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 loop txqueuelen 1000 (Local Loopback) RX packets 6090705 bytes 5765160422 (5.3 GiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 6090705 bytes 5765160422 (5.3 GiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [amittal@hills ~]$