对于需要关注系统性能的运维或者测试者来说,了解linux环境的系统版本、内存、CPU、硬盘和网卡等各种配置信息至关重要,对于工作在linux平台上的开发者来说同样很有必要。本文盘点了linux上查看系统配置的常用命令,希望对大家有帮助。
系统版本
Linus Torvalds发明了linux内核并一直维护至今,我们所用的linux都是基于这个内核的某个发行版。linux有很多发行版,不同的发行版面向的用户和应用场景不一样,比如线上环境经常用的CentOS、Debian,个人PC用的Ubuntu。我用的linux虚拟机是Arch linux,这是一种最近越来越受geek们追捧的以简洁为设计宗旨的发行版。那么如何查看内核版本和发行版呢?
下面的示例是在arch linux上运行的结果,但在所有发行版上都适用。
内核版本号
> cat /proc/version
Linux version 4.11.7-1-ARCH (builduser@tobias) (gcc version 7.1.1 20170621 (GCC) ) #1 SMP PREEMPT Sat Jun 24 09:07:09 CEST 2017
> uname -a
Linux yxr 4.11.7-1-ARCH #1 SMP PREEMPT Sat Jun 24 09:07:09 CEST 2017 x86_64 GNU/Linux
这两个命令都可以查看linux内核版本,即4.11.7-1-ARCH,除此之外,uname还显示了这是64位的版本,即x86_64,如果是32位,会显示i386。
根据man proc
的解释,/proc下是一些内核生成的特殊文件:
The proc filesystem is a pseudo-filesystem which provides an interface to kernel data structures.
发行版
使用以下三条命令之一
cat /etc/os-release
hostnamectl
lsb_release -a
例如
root@alibj ~ # hostnamectl
Static hostname: alibj
Icon name: computer-vm
Chassis: vm
Machine ID: 20200218155604663518171520219378
Boot ID: 7d2992a1c2114cda8e28802697f03a3b
Virtualization: kvm
Operating System: CentOS Linux 8 (Core)
CPE OS Name: cpe:/o:centos:centos:8
Kernel: Linux 4.18.0-147.5.1.el8_1.x86_64
Architecture: x86-64
内存
内存应该是我们最关心的资源。
还剩多少内存
> free -h
total used free shared buffers cached
Mem: 141G 132G 9.1G 428K 646M 86G
-/+ buffers/cache: 45G 96G
Swap: 63G 29M 63G
这是在CentOS上的输出,但是到底有多少内存是空闲的呢?
让我们先看一下各列的含义:
total
Your total, physical (assuming no virtualization) memoryused
How much of that is currently used (by anything)free
How much of that is completely free (not used at all)shared
(never anything there, ignore that column)buffers
Memory used by kernel bufferscached
Memory used for cache
显然,total=used+free,其中used是包含buffers+cached的
buffers和cache的内存是没有分配给具体进程的,当用户程序需要内存的时候可以使用这两块区域的内存,因此它们相当于空闲的。-/+ buffers/cache
的意思就是说从used减去buffers+cache,加到free之后used和free的大小。可以验证一下:
0.6+86≈87
132-87=45
9+87=96
哪个进程占用的内存最多
top命令可以列出占用CPU或内存最高的进程,但top的输出并非人人都懂,尤其是内存。
在CentOS上有4列信息与内存相关,根据man top
2a. DESCRIPTIONS of Fields,它们的含义如下:
VIRT — Virtual Image (kb)
The total amount of virtual memory used by the task. It includes all code, data and shared libraries plus pages that have been swapped out. (Note: you can define the STATSIZE=1 environment variable and the VIRT will be calculated from the /proc/#/state VmSize field.)
RES — Resident size (kb)
The non-swapped physical memory a task is using.
SHR — Shared Mem size (kb)
The amount of shared memory used by a task. It simply reflects memory that could be potentially shared with other processes.
%MEM — Memory usage (RES)
A task’s currently used share of available physical memory.
CPU
Central Processing Unit的简称。
几个处理器?几个核?
/proc/cpuinfo文件包含了每一个核的详细参数,几个关键参数如下:
- physical id : 物理处理器id,处理器(processor)是包含核的集合,一个芯片上可以有多个处理器
- cpu cores:当前处理器包含的核数,一个核(core)是具有通常意义上的处理器功能的最小单元。一个核可以通过超线程(Hyperthreading)的技术变出一个虚核(virtual core)来
- core id:该核在当前处理器上的id,可以不连续
- siblings:该处理器所有的核数,包括超线程出来的虚核,一般等于cpu cores x 2
- processor:该核(包括虚核)在整个芯片上的id。processor数代表了当前计算机能支持多少线程并行计算,也就是平常所说的N核的概念,这是程序员比较关系的,top中的一个CPU就对应这里的一个processor。
- model name:制造商、型号和频率
因此,查看处理器个数可以使用下面的方式:
grep "physical id" /proc/cpuinfo | sort | uniq -c
查看有几个核(这里的核也就是逻辑CPU):
grep process /proc/cpuinfo | wc -l
哪个进程占用的CPU最多
top默认按CPU使用率排序,%CPU的值是某个进程在1个逻辑CPU(一个核)上运行的时间的比例,因此:
- 对于24个核的CPU,%CPU的总和最大值为2400%
- 使用多线程的情况下,一个进程可以占用超过100%的CPU
总的Cpu使用比例?各个CPU的使用比例?
top第三行是CPU的总体信息,包括usr、sys、hi等,它们的总和等于100,idle
是空闲的CPU,因此100-idle
代表了CPU总的使用率。
在CPU繁忙的时候经常看到usr和sys的值都很高,因为:
usr
means it was processing userland code andsys
it was processing kernel code. The former is the code written by application and libraries developers while the latter is essentially due to the same application code performing system calls.
进入top的交互式界面,按数字1可以查看每个CPU的使用比例
负载是什么?
top输出第一行的load average表示系统1分钟、5分钟、15分钟的CPU负载信息,这些值是从/proc/loadavg
中获的。根据man proc
对/proc/loadavg_的解释,前3个值是run queue中的job数的平均值,即正在运行和等待磁盘IO的进程数的平均值。直观的说就是正在运行的进程数越多,系统负载越大。
1分钟的负载值为1相当于过去1分钟的时间里平均有1个进程使用了1个逻辑CPU的100%。因此,一种备受认可的看法是对于N核的CPU,当负载超过N时意味着过载了。
硬盘&文件系统
有几个盘?几个分区?磁盘的空间?
首先要弄清楚磁盘、分区和文件系统的关系。
一个磁盘代表一块裸的物理存储设备,对应一个设备文件,比如/dev/sda
。对磁盘可以逻辑的划分成更小的区域,即分区(partition)。一个磁盘可以有多个分区,不同的分区用设备文件后加数字编号表示,比如/dev/sda1
,/dev/sda2
。要在分区上存储数据还需要安装文件系统,即格式化(format)。可以为新的分区指定路径,即挂载(mount)。
fdisk可以显示每个磁盘的详细信息,包括它的空间和分区表,下面是我虚拟机的输出:
> fdisk -l
Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xbeb132b5
Device Boot Start End Sectors Size Id Type
/dev/sda1 2048 41943039 41940992 20G 83 Linux
lsblk的输出则更加简洁一些,下面是我们CDN存储设备的硬盘组织:
> lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 279.4G 0 disk
├─sdb1 8:17 0 215.4G 0 part /data/proclog
└─sdb2 8:18 0 64G 0 part [SWAP]
sda 8:0 0 279.4G 0 disk
├─sda1 8:1 0 200M 0 part /boot/efi
├─sda2 8:2 0 200M 0 part /boot
└─sda3 8:3 0 279G 0 part /
sdc 8:32 0 1.8T 0 disk
├─sdc1 8:33 0 298G 0 part
│ └─cache-sdc1-sdf1 (dm-0) 253:0 0 1.8T 0 dm /data/cache1
├─sdc2 8:34 0 297.1G 0 part
│ └─cache-sdc2-sdf2 (dm-1) 253:1 0 1.8T 0 dm /data/cache2
├─sdc3 8:35 0 297.1G 0 part
│ └─cache-sdc3-sdg1 (dm-2) 253:2 0 1.8T 0 dm /data/cache3
├─sdc4 8:36 0 297.1G 0 part
│ └─cache-sdc4-sdg2 (dm-3) 253:3 0 1.8T 0 dm /data/cache4
├─sdc5 8:37 0 297.1G 0 part
│ └─cache-sdc5-sdh1 (dm-4) 253:4 0 1.8T 0 dm /data/cache5
└─sdc6 8:38 0 297.5G 0 part
└─cache-sdc6-sdh2 (dm-5) 253:5 0 1.8T 0 dm /data/cache6
sdd 8:48 0 1.8T 0 disk
├─sdd1 8:49 0 298G 0 part
│ └─cache-sdd1-sdi1 (dm-6) 253:6 0 1.8T 0 dm /data/cache7
├─sdd2 8:50 0 297.1G 0 part
│ └─cache-sdd2-sdi2 (dm-7) 253:7 0 1.8T 0 dm /data/cache8
├─sdd3 8:51 0 297.1G 0 part
│ └─cache-sdd3-sdj1 (dm-8) 253:8 0 1.8T 0 dm /data/cache9
├─sdd4 8:52 0 297.1G 0 part
│ └─cache-sdd4-sdj2 (dm-9) 253:9 0 1.8T 0 dm /data/cache10
├─sdd5 8:53 0 297.1G 0 part
│ └─cache-sdd5-sdk1 (dm-10) 253:10 0 1.8T 0 dm /data/cache11
└─sdd6 8:54 0 297.5G 0 part
└─cache-sdd6-sdk2 (dm-11) 253:11 0 1.8T 0 dm /data/cache12
sde 8:64 0 1.8T 0 disk
├─sde1 8:65 0 298G 0 part
│ └─cache-sde1-sdl1 (dm-12) 253:12 0 1.8T 0 dm /data/cache13
├─sde2 8:66 0 297.1G 0 part
│ └─cache-sde2-sdl2 (dm-13) 253:13 0 1.8T 0 dm /data/cache14
├─sde3 8:67 0 297.1G 0 part
│ └─cache-sde3-sdm1 (dm-14) 253:14 0 1.8T 0 dm /data/cache15
├─sde4 8:68 0 297.1G 0 part
│ └─cache-sde4-sdm2 (dm-15) 253:15 0 1.8T 0 dm /data/cache16
├─sde5 8:69 0 297.1G 0 part
│ └─cache-sde5-sdn1 (dm-16) 253:16 0 1.8T 0 dm /data/cache17
└─sde6 8:70 0 297.5G 0 part
└─cache-sde6-sdn2 (dm-17) 253:17 0 1.8T 0 dm /data/cache18
sdj 8:144 0 3.7T 0 disk
├─sdj1 8:145 0 1.8T 0 part
│ └─cache-sdd3-sdj1 (dm-8) 253:8 0 1.8T 0 dm /data/cache9
└─sdj2 8:146 0 1.8T 0 part
└─cache-sdd4-sdj2 (dm-9) 253:9 0 1.8T 0 dm /data/cache10
sdn 8:208 0 3.7T 0 disk
├─sdn1 8:209 0 1.8T 0 part
│ └─cache-sde5-sdn1 (dm-16) 253:16 0 1.8T 0 dm /data/cache17
└─sdn2 8:210 0 1.8T 0 part
└─cache-sde6-sdn2 (dm-17) 253:17 0 1.8T 0 dm /data/cache18
sdl 8:176 0 3.7T 0 disk
├─sdl1 8:177 0 1.8T 0 part
│ └─cache-sde1-sdl1 (dm-12) 253:12 0 1.8T 0 dm /data/cache13
└─sdl2 8:178 0 1.8T 0 part
└─cache-sde2-sdl2 (dm-13) 253:13 0 1.8T 0 dm /data/cache14
sdi 8:128 0 3.7T 0 disk
├─sdi1 8:129 0 1.8T 0 part
│ └─cache-sdd1-sdi1 (dm-6) 253:6 0 1.8T 0 dm /data/cache7
└─sdi2 8:130 0 1.8T 0 part
└─cache-sdd2-sdi2 (dm-7) 253:7 0 1.8T 0 dm /data/cache8
sdg 8:96 0 3.7T 0 disk
├─sdg1 8:97 0 1.8T 0 part
│ └─cache-sdc3-sdg1 (dm-2) 253:2 0 1.8T 0 dm /data/cache3
└─sdg2 8:98 0 1.8T 0 part
└─cache-sdc4-sdg2 (dm-3) 253:3 0 1.8T 0 dm /data/cache4
sdf 8:80 0 3.7T 0 disk
├─sdf1 8:81 0 1.8T 0 part
│ └─cache-sdc1-sdf1 (dm-0) 253:0 0 1.8T 0 dm /data/cache1
└─sdf2 8:82 0 1.8T 0 part
└─cache-sdc2-sdf2 (dm-1) 253:1 0 1.8T 0 dm /data/cache2
sdm 8:192 0 3.7T 0 disk
├─sdm1 8:193 0 1.8T 0 part
│ └─cache-sde3-sdm1 (dm-14) 253:14 0 1.8T 0 dm /data/cache15
└─sdm2 8:194 0 1.8T 0 part
└─cache-sde4-sdm2 (dm-15) 253:15 0 1.8T 0 dm /data/cache16
sdk 8:160 0 3.7T 0 disk
├─sdk1 8:161 0 1.8T 0 part
│ └─cache-sdd5-sdk1 (dm-10) 253:10 0 1.8T 0 dm /data/cache11
└─sdk2 8:162 0 1.8T 0 part
└─cache-sdd6-sdk2 (dm-11) 253:11 0 1.8T 0 dm /data/cache12
sdh 8:112 0 3.7T 0 disk
├─sdh1 8:113 0 1.8T 0 part
│ └─cache-sdc5-sdh1 (dm-4) 253:4 0 1.8T 0 dm /data/cache5
└─sdh2 8:114 0 1.8T 0 part
└─cache-sdc6-sdh2 (dm-5) 253:5 0 1.8T 0 dm /data/cache6
- a作为系统盘,b用来放日志;
- cde是三块ssd,每个盘分6个区,一共3x6=18个分区;
- f~n是hdd,每个盘分2个区,一共9x2=18个分区;
- 最后通过flashcache技术将ssd作为hdd的缓存加快随机读写速度。
列出所有文件系统
df可以显示每个文件系统的:
- 文件系统类型
- 存储空间
- 挂载点
df -Th
是固态硬盘(SSD)吗?
check if a disk is an SSD or an HDD You should get 1 for hard disks and 0 for a SSD.
cat /sys/block/sda/queue/rotational
磁盘的读写性能(measure disk perfomance)
通常使用dd命令来测试地盘的读写性能,dd工具本身的作用是拷贝文件,但它允许指定每次读写的块大小(bs)。
下面的方式可以测试当前目录所在的硬盘的IO速度,如果硬盘尚未安装文件系统,把./largefile改成硬盘的设备号。
# Write speed
> dd if=/dev/zero of=./largefile bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 4.82364 s, 223 MB/s
Block size is actually quite large. You can try with smaller sizes like 64k or even 4k.
# Read speed
# Run the following command to clear the memory cache
> sudo sh -c "sync && echo 3 > /proc/sys/vm/drop_caches"
# Now read the file which was created in write test:
> dd if=./largefile of=/dev/null bs=4k
165118+0 records in
165118+0 records out
676323328 bytes (676 MB) copied, 3.0114 s, 225 MB/s
监控磁盘IO
-
iostat:显示每个磁盘的读写速度
iostat -x -m 3
-
iotop:一个类似top的显示每个进程/线程的磁盘读写速度
网络
本机ip
查看本机ip是我们最熟悉不过的了
更强大的ip工具正在取代ifconfig
一台服务器可以有多个网卡,每个网卡一个ip,因此ip和网卡的对应关系也是需要注意的。
外网ip
查看外网ip就不那么容易了。 因为我们的PC一般都是共用一个外网ip,由路由器进行网络地址转换,在本机要获取该外网ip只能访问一个外网的服务。国外一个开发者随手写了一个这样的服务放到网上,因为这种需求非常频繁,该服务的日均访问量居然达到十亿。该接口的使用方法:
curl ipinfo.io[/ip]
示例:
> curl ipinfo.io
{
"ip": "218.241.243.196",
"city": "Beijing",
"region": "Beijing",
"country": "CN",
"loc": "39.9289,116.3883",
"org": "AS4847 CHINANET core WAN AS"
}
端口被哪个进程占用了
netstat -tunlp|grep 端口号
ps -ef|grep 进程号
- t: tcp
- u: udp
- n: do not resolve socket address to its canonical host name
- l: Show only listening sockets
- p: Show the PID and name of the program to which each socket belongs
示例:
> netstat -tunlp|grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 62486/nginx: master
> ps 62486
PID TTY STAT TIME COMMAND
62486 ? Ss 0:00 nginx: master process /opt/nginx/sbin/nginx
> ps -ef|grep 62486
root 62486 1 0 11:04 ? 00:00:00 nginx: master process /opt/nginx/sbin/nginx
nobody 62487 62486 0 11:04 ? 00:00:00 nginx: worker process
root 62699 28069 0 11:04 pts/2 00:00:00 grep --color=auto 62486
网卡是千兆还是万兆
要查看一个网卡是千兆还是万兆的,使用ethtool工具
ethtool em1
实时带宽
iftop和nethogs这两个工具都能查看当前的带宽/实时网速/比特率,它们之间最大的不同是iftop能显示每一对源地址-目的地址的比特率,而nethogs能按进程显示比特率。
iftop
iftop - display bandwidth usage on an interface by host
nethogs
NetHogs is a small 'net top' tool. Instead of breaking the traffic down per protocol or per subnet, like most tools do, it groups bandwidth by process.
参考
- Askubuntu: How do I check if I have a 32-bit or a 64-bit OS?
free
: output format- Number of processors in /proc/cpuinfo
- In Linux “top” command what are us, sy, ni, id, wa, hi, si and st (for CPU usage)?
- Linux工具快速教程->8. top linux下的任务管理器
- How To Partition and Format Storage Devices in Linux
- How to check hard disk performance
- How can I monitor disk io?
- Stackoverflow: Network usage top/htop on Linux