天天看点

《构建高可用Linux服务器 第3版》—— 1.2 全面了解Linux服务器

本节书摘来自华章出版社《构建高可用linux服务器 第3版》一 书中的第1章,第1.2节,作者:余洪春 ,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

我的日常工作之一就是到公司的内部机房或托管的idc机房从事相关的系统工作,里面的linux服务器少则十几台,多则上百台。为了便于工作,通常这时候我就会非常想清楚地了解服务器的硬件配置。但是客户往往并不能提供详细的硬件配置清单,仅仅能提供系统管理员的密码,所以我总结了一些查看服务器情况的命令,它们可以很清楚地反映linux服务器的状态、性能等详细信息。以下内容完全出自项目的实践总结,也希望大家能够熟练掌握,方便自己的工作。

判断linux服务器cpu情况的依据如下:

《构建高可用Linux服务器 第3版》—— 1.2 全面了解Linux服务器

具有相同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

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

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.60

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

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查看一下。

结果如下所示:

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), stripped

3.查看服务器使用的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设置

有时需要在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服务器的性能状态,这会对工作有很大帮助。

继续阅读