《构建高可用Linux服务器 第3版》—— 1.2 全面了解Linux服务器-阿里云开发者社区

开发者社区> 华章出版社> 正文
登录阅读全文

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

简介:

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

1.2 全面了解Linux服务器

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

1.2.1 查看Linux服务器的CPU详细情况

判断Linux服务器CPU情况的依据如下:
screenshot

具有相同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个数为准。

1.2.2 查看Linux服务器的内存使用情况

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

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  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的负荷很重。

1.2.5 查看Linux系统的其他参数

本节主要从服务器的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

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享: