本文共 10861 字,大约阅读时间需要 36 分钟。
本节书摘来自华章出版社《构建高可用Linux服务器 第3版》一 书中的第1章,第1.2节,作者:余洪春 ,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
我的日常工作之一就是到公司的内部机房或托管的IDC机房从事相关的系统工作,里面的Linux服务器少则十几台,多则上百台。为了便于工作,通常这时候我就会非常想清楚地了解服务器的硬件配置。但是客户往往并不能提供详细的硬件配置清单,仅仅能提供系统管理员的密码,所以我总结了一些查看服务器情况的命令,它们可以很清楚地反映Linux服务器的状态、性能等详细信息。以下内容完全出自项目的实践总结,也希望大家能够熟练掌握,方便自己的工作。
判断Linux服务器CPU情况的依据如下:
具有相同core id的CPU是同一个core的超线程。
具有相同physical id的CPU是同一个CPU封装的线程或核心。
下面以笔者自己的PowerEdge 2850服务器为例进一步进行说明。
显示物理CPU个数的命令如下所示:
cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l
命令结果显示如下所示:2
显示每个物理CPU中core的个数(即核数)的命令如下所示:cat /proc/cpuinfo | grep "cpu cores" | uniq
命令结果显示如下所示:cpu cores : 1
显示逻辑CPU的个数的命令如下所示:cat /proc/cpuinfo | grep "processor" | wc -l
命令结果显示如下所示:4
其实大家从这里就可以看出来,按理说应有如下等式:物理CPU个数×核数=逻辑CPU的个数
如果不相等的话,则表示你的服务器CPU支持超线程技术。我们在配置服务器的应用时,应以服务器的逻辑CPU个数为准。
查看Linux服务器的内存使用情况,我们可以使用如下命令:
free -m
Free命令显示的是当前内存的使用情况,m的意思是以M个字节来显示内容,此命令只在Linux系统下有效,在FreeBSD下是没有此命令的。命令显示结果如下所示:total used free shared buffers cached
Mem: 3949 1397 2551 0 268 917
-/+ buffers/cache: 211 3737
Swap: 8001 0 8001
上述结果中各个参数的详细说明如下:total :内存总数。
used :已经使用的内存数。
free :空闲的内存数。
shared :多个进程共享的内存总额。
buffers buffer cache和cached page cache :磁盘缓存的大小。
-buffers/cache: (已用)的内存数,即used-buffers-cached。
+buffers/cache:(可用)的内存数,即free + buffers + cached。
由此得出结论,可用内存的计算公式为
可用内存=free+buffers+cached
即
2551MB+268MB+917MB=3737MB
注意 细心的读者朋友们可能会发现上面等式两边的数值并不相等,但这个没关系,-m参数其实是以整数数值来取舍的。大家如果对这个运算结果有怀疑,可以尝试不带-m参数来观看free命令显示的结果,这样就会一目了然了。
可见-buffers/cache反映的是被程序实实在在占用的内存,而+buffers/cache反映的是可以挪用的内存总数。
第三部分是指交换分区,比较简单,这里不再介绍了。
有可能大家看了上面的解释还是不太明白。比如:第一部分(Mem)与第二部分(-/+buffers/cache)的结果有关,used和free为什么这么奇怪?其实我们可以从两个方面来分析。对操作系统来讲这两项是Mem的参数,buffers/cached都属于被使用,所以它认为free只有2551MB;对应用程序来讲+buffers/cached等同可用的内存,因为buffer/cached可提高程序执行的性能,当程序使用内存时,buffer/cached很快就会被使用。所以从应用的角度来看,应以(-/+ buffers/cache)的free和used为主。那么我们主要看与它相关的free和used就可以了。另外告诉大家一些常识,Linux为了提高磁盘和内存的存取效率,它做了很多精心的设计,除了对dentry进行缓存外(用于VFS、加速文件路径名到inode的转换),还采取了两种主要cache方式:buffer cache和page cache,前者针对磁盘块的读写,后者针对文件inode的读写。这些cache能有效地缩短I/O系统调用(比如read、write、getdents)的时间。
在Linux系统中,内存是拿来用的,不是用来看的。而在Windows系统中,无论你的真实物理内存有多少,它都会用硬盘交换文件来读,即使是内存还有一大部分。这也就是Windows系统常常提示虚拟空间不足的原因。可以想象得到,硬盘的速度怎么会快过内存,所以我们在观察Linux系统的内存使用情况时,只要没发现用swap的交换空间,就不用担心自己的内存太小。如果常常看到swap用了很多,你可能就要考虑增加物理内存了。这也是在Linux服务器上看内存是否够用的标准。
1.2.3 查看Linux服务器的硬盘使用情况
想要了解Linux服务器的硬盘使用情况,可以根据以下步骤查看。
1)查看硬盘及分区信息,如下所示:
fdisk –l
命令显示结果如下:Disk /dev/sda: 160.0 GB, 160040803840 bytes
255 heads, 63 sectors/track, 19457 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 3200 25599577+ 83 Linux
/dev/sda3 3201 3582 3068415 82 Linux swap / Solaris
/dev/sda4 3583 19457 127515937+ 5 Extended
/dev/sda5 3583 19457 127515906 83 Linux
以上结果表明这是一块160GB的服务器硬盘。2)检查文件系统的磁盘空间占用情况,命令如下所示:
df –h
命令显示结果如下:Filesystem Size Used Avail Use% Mounted on
/dev/sda2 24G 5.9G 17G 26% /
/dev/sda5 118G 8.8G 103G 8% /data
/dev/sda1 99M 20M 75M 21% /boot
tmpfs 859M 0 859M 0% /dev/shm
none 859M 104K 858M 1% /var/lib/xenstored
3)查看硬盘的I/O性能,命令如下所示:iostat –d -x –k 1 10
其中,iostat是含在套装sysstat中的,在CentOS 5.8下可以用如下命令进行安装:yum –y install sysstat
以笔者的生产环境下的MySQL数据库服务器为例说明,在Pietty下输入以下命令:iostat –d –x –k 1 5
得到的结果如下所示:Linux 2.6.9-34.ELsmp (ud50053) 01/18/2012 _i686_ (4 CPU)
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
hda 0.19 63.84 0.48 26.94 12.84 363.08 27.43 0.07 2.64 8.36 2.54 0.62 1.70
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
hda 0.00 44.00 3.00 29.00 16.00 292.00 19.25 0.06 1.88 12.67 0.76 1.50 4.80
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
hda 0.00 2.00 0.00 16.00 0.00 76.00 9.50 0.01 0.69 0.00
0.69 0.38 0.60Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
hda 0.00 380.00 0.00 79.00 0.00 1832.00 46.38 0.32 4.01 0.00 4.01 0.65 5.10
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
hda 0.00 7.00 0.00 8.00 0.00 60.00 15.00 0.01 0.88 0.00
0.88 0.38 0.30参数说明:rrqm/s:每秒进行merge的读操作数目,即delta(rmerge)/s。
wrqm/s:每秒进行merge的写操作数目,即delta(wmerge)/s。
r/s:每秒完成的读I/O设备的次数,即delta(rio)/s。
w/s:每秒完成的写I/O设备的次数,即delta(wio)/s。
rsec/s:每秒读扇区数,即delta(rsect)/s。
wsec/s:每秒写扇区数,即delta(wsect)/s。
rkB/s:每秒读千字节数,是rsect/s的一半,因为每扇区大小为512字节。
wkB/s:每秒写千字节数,是wsect/s的一半。
avgrq-sz:平均每次设备I/O操作的数据大小(即扇区),即delta(rsect+wsect)/delta(rio+wio)。
avgqu-sz:平均I/O队列的长度。即delta(aveq)/s/1000(除以1000是因为aveq的单位为毫秒)。
await:平均每次设备I/O操作的等待时间(单位:毫秒),即delta(ruse+wuse)/delta(rio+wio)。
svctm:平均每次设备I/O操作的服务时间(单位:毫秒),即delta(use)/delta(rio+wio)。
%util:一秒中有百分之多少的时间用于I/O操作,或者说一秒中有多少时间I/O队列是非空的,即delta(use)/s/1000(因为use的单位为毫秒)。
大家可能对这些参数和名词解释不太明白,不要紧,其实在工作中我们只需关注以下几个方面即可:
如果%util接近100%,则说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。
await的大小一般取决于服务时间(svctm),以及I/O队列的长度和I/O请求的发出模式。这个响应时间应该低于5ms,如果大于5ms就表示磁盘I/O压力很大,这时就可以考虑更换响应速度更快的磁盘,调整内核elevator的算法、优化应用或者升级CPU。
4)查看Linux系统中某目录的大小,这在工作中经常会遇到。可以使用如下命令查看:
du -sh 目录名
例如:du -sh /data
命令显示结果如下所示:8.6G /data/
检查是否有分区使用率(Use%)过高(比如超过90%),如发现某个分区空间接近用完,可以进入该分区的挂载点,用以下命令找出占用空间最多的文件或目录,然后按照从大到小的顺序,正好可以找出系统中占用最多空间的前十个文件或目录:du -cks * | sort -rn | head -n 10
5)在Linux系统中经常会用到dd命令,很多时候维护系统工作时需要使用。dd命令可以把指定的输入文件复制到指定的输出文件中,并且在复制过程中可以进行格式转换。我碰到的需要用到dd命令的几个地方如下所示。制作交换文件的时候,例如:
dd if=/dev/zero of=/swapfile bs=1024 count=65536
制作驱动盘的时候,例如,将硬盘上的驱动文件复制到一个软驱中:dd if=rhel40.img of=/dev/fd0 bs=10k
或者dd if=mptlinux-3.02.68-1-rhel4.i686.dd of=/dev/fd0 bs=10k
制作ISO镜像的时候,例如:dd if=/dev/cdrom of=/root/cd1.iso
当然也可以用mkisofs命令来制作ISO镜像。另外,重装系统的时候,我喜欢用dd命令来破坏系统的分区表,由于此命令破坏性极大,会带来严重的后果。为了防止读者误操作,这里就不介绍了,有兴趣的读者可自行研究。
下面将分别介绍dd命令的参数,如下所示:
if=file
上述参数表示输入文件名,默认为标准输入。of=file
上述参数表示输出文件名,默认为标准输出。ibs=bytes
上述参数表示一次读入bytes个字节(即一个块大小为bytes个字节)。obs=bytes
上述参数表示一次写bytes个字节(即一个块大小为bytes个字节)。bs=bytes
上述参数表示同时设置读写块的大小为bytes,可代替ibs和obs。cbs=bytes
上述参数表示一次转换bytes个字节,即转换缓冲区大小。skip=blocks
上述参数表示从输入文件开头跳过blocks个块后再开始复制。seek=blocks
上述参数表示从输出文件开头跳过blocks个块后再开始复制(通常当输出文件是磁盘或磁带时才有效)。count=blocks
上述参数表示仅复制blocks个块,块大小等于ibs指定的字节数。1.2.4 查看Linux系统的平均负载
1.平均负载的概念
有时候我们会觉得系统响应速度很慢,但是又找不到原因,这时就要查平均负载了,看它是否有大量的进程在排队等待。特定时间间隔内运行队列中的平均进程数可以反映系统的繁忙程度,所以我们通常会在自己的网站或系统变慢时第一时间查系统的负载,即CPU的平均负载。
2.查看平均负载
究竟应该如何查看平均负载呢?最简单的命令是uptime,如下所示:
uptime
命令显示结果如下:11:31:11 up 11 days, 19:01, 2 users, load average: 0.02, 0.01, 0.00
目前的主流服务器都是双四核,有相当强悍的CPU,提供一般的应用服务时,不必担心Linux系统的负载。还可以用w命令来查看,顺便可以查看系统当前有哪些用户,它们占用了哪些终端,如下所示:
w
命令显示结果如下所示:11:33:00 up 11 days, 19:03, 2 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/1 113.57.224.3 09:03 2:11m 0.04s 0.04s -bash
root pts/2 113.57.224.3 11:31 0.00s 0.02s 0.00s w
另外,还有动态命令top,这个命令也可以反映系统负载情况。top
系统会动态地显示内容,结果如下所示:top - 15:01:25 up 12 days, 3:46, 2 users, load average: 1.76, 2.14, 2.20
Tasks: 116 total, 1 running, 115 sleeping, 0 stopped, 0 zombie
Cpu(s): 47.5% us, 14.6% sy, 0.0% ni, 37.6% id, 0.3% wa, 0.1% hi, 0.0% si
Mem: 8180164k total, 7673268k used, 506896k free, 74592k buffers
Swap: 0k total, 0k used, 0k free, 4613728k cached
第一行内容正是系统目前的负载情况,再通过uptime查看一下。uptime
结果如下所示:15:02:50 up 12 days, 3:48, 2 users, load average: 1.75, 2.07, 2.17
原来它所表示的是过去1分钟、5分钟和15分钟内进程队列中的平均进程数量。这里需要注意的是load average的输出值,这三个值的大小一般不能大于系统逻辑CPU的个数,例如,本输出中系统有4个逻辑CPU,如果load average的三个值长期大于4,说明CPU很繁忙,负载很高,可能会影响系统性能,但是偶尔大于4时,不用担心,一般不会影响系统性能。相反,如果load average的输出值小于CPU的个数,则表示CPU还有空闲的,比如本例中的输出,CPU是比较空闲的。
这时候可以结合vmstat命令来判断我们的系统是否过于繁忙,如果确定很繁忙,就要考虑是否更换服务器或增加CPU的个数了。总结如下:
如果r经常大于3或4,且id经常少于50,则表示CPU的负荷很重。
本节主要从服务器的CPU、内存、硬盘性能、负载及其他方面详细说明Linux服务器的整体性能状态,希望大家通过本节所列的方法来了解自己的Linux服务器的性能状态,这会对工作有很大帮助。
1.用vmstat监控Linux系统的整体性能
vmstat是一个相当全面的性能分析工具,通过它可以观察系统的进程状态、内存使用情况、虚拟内存的使用情况、磁盘的I/O、中断、上下文切换、CPU的使用情况等性能信息,建议熟练掌握此命令。举例如下:
vmstat 1 4
显示结果如下所示:procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
2 0 0 519024 74732 4606568 0 0 3 9 5 10 27 5 68 0
2 0 0 519664 74732 4606568 0 0 0 0 1847 1244 20 17 63 0
1 0 0 517296 74732 4606568 0 0 0 284 2092 1617 37 17 47 0
3 0 0 515440 74732 4606568 0 0 0 164 1620 718 26 17 57 0
其中:(1)procs
r:等待运行的进程数。
b:处于非中断睡眠状态的进程数。
(2)memory
swpd:虚拟内存使用情况(单位:KB)。
free:空闲的内存(单位:KB)。
buff:被用来作为缓存的内存数量(单位:KB)。
(3)swap
si:从磁盘交换到内存的交换页数量(单位:KB/s)。
so:从内存交换到磁盘的交换页数量(单位:KB/s)。
(4)io
bi:发送到块设备的块数(单位:块/秒)。
bo:从块设备接收到的块数(单位:块/秒)。
(5)system
in:每秒的中断数,包括时钟中断。
cs:每秒的环境(上下文)切换次数。
(6)cpu
按CPU的总使用百分比来显示。
us:CPU使用时间。
sy:CPU系统使用时间。
id:闲置时间。
标准情况下r和b值应该为:r<5,b≈0。
如果user%+sys%<70%则表示系统性能较好,如果user%+sys%>=85%或以上,这表示系统性能比较糟糕,这时就要对系统进行全方面检查了。其中:
user%表示CPU处在用户模式下的时间百分比。
sys%表示CPU处在系统模式下的时间百分比。
2.查看系统内核
要查看系统内核的版本号,可以用如下命令:
uname –a
结果如下所示:Linux xen.cn7788.com 2.6.18-308.el5 #1 SMP Tue Feb 21 20:06:06 EST 2012 x86_64 x86_64 x86_64 GNU/Linux
简化的参数命令及其结果如下:uname -r
2.6.18-194.el5
如果要查看系统是32位还是64位,可以用如下命令:[root@localhost /]# ls -lF / | grep /s
此命令会查找是否有/lib64目录,有则系统为x86_64位系统,无则表示系统为i386位系统,查找情况如下所示:ls -lF / | grep /$ | grep lib64
结果显示如下:drwxr-xr-x 10 root root 4096 Mar 4 04:02 lib64
另一种常见方法是通过file命令来判断系统中的文件是32位还是64位的,作为判断系统的依据,如下所示:file /sbin/init
命令显示如下结果(结果表示系统为x86_64位的):/sbin/init: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.6.9,
dynamically linked (uses shared libs), stripped3.查看服务器使用的Linux发行版的相关信息下面的命令可查看服务器使用的Linux发行版的名称、版本号及描述信息等:
lsb_release -a
命令显示如下结果:LSB Version:
:core-4.0-amd64:core-4.0-ia32:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-ia32:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-ia32:printing-4.0-noarch
Distributor ID: CentOS
Description: CentOS release 5.8 (Final)
Release: 5.8
Codename: Final
如果CentOS 5.8下没有此命令,可以通过如下方式安装:yum-y install redhat-lsb
4.查看系统已载入的相关模块
Linux操作系统的核心具有模块化的特性,因此在编译核心时,无须把全部的功能都放入核心。可以将这些功能编译成一个个单独的模块,待需要时再分别载入。例如,在安装基于LVS+Keepalived负载均衡高可用软件时,经常会用lsmod来查看lvs模块是否已经载入,如下所示:
lsmod | grep ip_vs
命令显示如下结果:ip_vs_wrr 35905 1
ip_vs 122113 3 ip_vs_wrr
有时需要在Linux下查找PCI设置,可以用lspci命令,它能列出机器中的PCI设备信息,比如声卡、显卡、Modem、网卡等的信息,也能列出主板集成设备的信息。lspci读取的是hwdata数据库。可能有的读者和我一样,最关心的还是网卡型号:
lspci | grep Ether
命令显示如下结果:00:19.0 Ethernet controller: Intel Corporation: Unknown device 10bd (rev 02)
07:00.0 Ethernet controller: Intel Corporation 82573L Gigabit Ethernet Controller
我们一般用命令miit-tool监控网卡,它可以用来检测机器网卡是否正常连接,例如,下面显示的结果就表示是正常的,如果没出现下面的结果就需要排查错误了:
eth0: negotiated 100baseTx-FD flow-control, link ok
这一节主要从服务器的CPU、内存、硬盘性能、负载及其他方面详细说明了如何查看Linux服务器的整体性能状态,希望大家通过以上所列的方法来了解自己的Linux服务器的性能状态,这会对工作有很大帮助。转载地址:http://hcyil.baihongyu.com/