• Linux 磁盘挂载基本概念

    背景:

    Linux的mount 等磁盘操作信息是系统管理员应该熟记于心的基本内容。 遇到问题应该具备快速定位的能力,并具有发散思维解决问题的能力。 因为大多是一些基本的概念并且网上资料很全,但 细节决定成败,有扎实的基础也是同样重要的。此博文即用来总结备忘。

    mount (挂载)

    命令格式:mount [-t vfstype] [-o options] device dir

    -t    vfstype 指定文件系统的类型。常用类型有:

    •   光盘或光盘镜像:iso9660
    •   DOS fat16文件系统:msdos
    •   Windows 9x fat32文件系统:vfat
    •   Windows NT ntfs文件系统:ntfs
    •   Mount Windows文件网络共享:smbfs
    •   UNIX(LINUX) 文件网络共享:nfs、ext3、ext4 等

    -o options 主要用来描述设备或文件的挂载方式。常用的参数有:

    •        loop:用来把一个文件当成硬盘分区挂接上系统
    •   ro:采用只读方式挂接设备
    •   rw:采用读写方式挂接设备
    •   iocharset:指定访问文件系统所用字符集

    device 表示要挂接(mount)的设备。

    dir  表示设备在系统上的挂接点(mount point)

    umount (卸载)

    命令格式: umount <挂载点|设备>

    注: 使用umount命令时很方便,无论你指定device(设备)或者dir(文件)都可以。

    有些时候,我们在Linux需要执行umount常常会碰到此设备正在被使用,无法卸载的状况。 遇到这种情况时,通常我们可以有两种办法:

    1. 通过lsof命令查看此分区到底有哪些还处于被使用状态,逐一清除

    2. 可以使用umount -l 参数,此命令将会断开设备并关闭打开该设备的全部句柄。

    /etc/fstab 文件

    Linux系统下,  /etc/fstab 文件记录了当前系统的磁盘挂载信息。 在Linux开机的时候,会自动去读取并根据此文件中的信息进行磁盘挂载和检测等操作:

    yy

    • 第一列 (device)是磁盘设备的文件名 或 该设备的label (标签) 。

    —— 什么是label(标签)呢? 其实这个就好比Windows系统中的标示C盘D盘的那些信息一样,比如我们通常会给C盘起个名字为系统盘,给F盘起名字为“娱乐”。

    • 第二列  (mount point)挂载点
    • 第三列  文件系统
    • 第四列  文件系统参数 ,即我们在mount挂载的时候,用-o参数指定的参数。比如:

    async / sync : 设置磁盘是否以异步方式运行。

    auto / noauto: 当用mount  -a命令时,此文件系统是否被主动测试挂载。

    defaults : 同时具有rw (可读写),suid (允许suid的存在),dev , exec , auto , nouser (不允许普通用户挂载), async

    • 第五列  能否被dump备份命令作用, dump是一个备份的命令,0 表示不要做dump备份,1表示每天进行dump的操作,2代表其他不定日期的dump备份操作。通常不是0就是1。
    • 第六列: 是否已fsck检验扇区 ,开机的过程中,系统会以fsck检验我们的文件系统是否完整 。 0是不要检测, 1 表示最早检测(一般只有/目录会设置为1),2表示稍晚检测。一般将根目录设置为1 ,其他目录设置为2 即可。

    :/etc/fstab 是开机时的挂载配置,实际上文件系统的挂载是记录到/etc/mtab 与 /proc/mounts这两个文件当中的。每次我们在改动文件系统的挂载时,也会同时跟动这两个文件。 当你在/etc/fstab里的配置写错时,导致无法开机,则可以进入单例模式中。到时候虽然 / 是readonly的,可以使用下面的命令:

    mount  -n  -o  remount,rw  /

     

  • Linux系统状态——网络

    背景,概念:

    网络的监测是所有 Linux 子系统里面最复杂的,有太多的因素在里面,比如:延迟、阻塞、冲突、丢包等,更糟的是与 Linux 主机相连的路由器、交换机、无线信号都会影响到整体网络并且很难判断是因为 Linux 网络子系统的问题还是别的设备的问题,增加了监测和判断的复杂度。现在我们使用的所有网卡都称为自适应网卡,意思是说能根据网络上的不同网络设备导致的不同网络速度和工作模式进行自动调整。我们可以通过 ethtool 工具来查看网卡的配置和工作模式:

    eth

    上面给出的例子说明网卡有 10baseT,100baseT 和 1000baseT 三种选择,目前正自适应为 1000baseT(Speed: 1000Mb/s)

    查看网络信息:

    1.  通过nload可以直观的查看总的io情况。结果显示很直观。可以用左右方向键来切换观察各个网卡 。nload是一个命令行工具,让用户可以分开来监控入站流量和出站流量。它还可以绘制图表以显示入站流量和出站流量,视图比例可以调整。用起来很简单.

    所以,如果你只需要快速查看总带宽使用情况,无需每个进程的详细情况,那么nload用起来很方便。

    2.  iftop可测量通过每一个套接字连接传输的数据;它采用的工作方式有别于nload。iftop使用pcap库来捕获进出网络适配器的数据包,然后汇总数据包大小和数量,搞清楚总的带宽使用情况。

    虽然iftop报告每个连接所使用的带宽,但它无法报告参与某个套按字连接的进程名称/编号(ID)。不过由于基于pcap库,iftop能够过滤流量,并报告由过滤器指定的所选定主机连接的带宽使用情况。

    iftop  -n  -i eth1

    • TX:发送流量
    • RX:接收流量
    • TOTAL:总流量
    • Cumm:运行iftop到目前时间的总流量
    • peak:流量峰值
    • rates:分别表示过去 2s 10s 40s 的平均流量

     

    参考:http://www.vpsee.com/2009/11/linux-system-performance-monitoring-network/

     

  • Linux系统状态——I/O

    概念:

    磁盘通常是计算机最慢的子系统,也是最容易出现性能瓶颈的地方,因为磁盘离 CPU 距离最远而且 CPU 访问磁盘要涉及到机械操作,比如转轴、寻轨等。访问硬盘和访问内存之间的速度差别是以数量级来计算的,就像1天和1分钟的差别一样。要监测 IO 性能,有必要了解一下基本原理和 Linux 是如何处理硬盘和内存之间的 IO 的。内存和硬盘之间的 IO 是以页为单位来进行的,在 Linux 系统上1页的大小为 4K

    缺页中断

    Linux 利用虚拟内存极大的扩展了程序地址空间,使得原来物理内存不能容下的程序也可以通过内存和硬盘之间的不断交换(把暂时不用的内存页交换到硬盘,把需要的内存页从硬盘读到内存)来赢得更多的内存,看起来就像物理内存被扩大了一样。事实上这个过程对程序是完全透明的,程序完全不用理会自己哪一部分、什么时候被交换进内存,一切都有内核的虚拟内存管理来完成。当程序启动的时候,Linux 内核首先检查 CPU 的缓存和物理内存,如果数据已经在内存里就忽略,如果数据不在内存里就引起一个缺页中断(Page Fault),然后从硬盘读取缺页,并把缺页缓存到物理内存里。缺页中断可分为主缺页中断(Major Page Fault)和次缺页中断(Minor Page Fault),要从磁盘读取数据而产生的中断是主缺页中断;数据已经被读入内存并被缓存起来,从内存缓存区中而不是直接从硬盘中读取数据而产生的中断是次缺页中断。

    上面的内存缓存区起到了预读硬盘的作用,内核先在物理内存里寻找缺页,没有的话产生次缺页中断从内存缓存里找,如果还没有发现的话就从硬盘读取。很显然,把多余的内存拿出来做成内存缓存区提高了访问速度,这里还有一个命中率的问题,运气好的话如果每次缺页都能从内存缓存区读取的话将会极大提高性能。要提高命中率的一个简单方法就是增大内存缓存区面积,缓存区越大预存的页面就越多,命中率也会越高。

    File Buffer Cache

    从上面的内存缓存区(也叫文件缓存区 File Buffer Cache)读取页比从硬盘读取页要快得多,所以 Linux 内核希望能尽可能产生次缺页中断(从文件缓存区读),并且能尽可能避免主缺页中断(从硬盘读),这样随着次缺页中断的增多,文件缓存区也逐步增大,直到系统只有少量可用物理内存的时候 Linux 才开始释放一些不用的页。我们运行 Linux 一段时间后会发现虽然系统上运行的程序不多,但是可用内存总是很少,这样给大家造成了 Linux 对内存管理很低效的假象,事实上 Linux 把那些暂时不用的物理内存高效的利用起来做预存(内存缓存区)呢。

    cipan

    内存总量: 8G

    内存可用量: 2G

    磁盘缓存(写入到磁盘的缓存):192M

    文件缓存(从磁盘读取到的缓存):1G

    页面类型

    Linux 中内存页面有三种类型:

    • Read pages,只读页(或代码页),那些通过主缺页中断从硬盘读取的页面,包括不能修改的静态文件、可执行文件、库文件等。当内核需要它们的时候把它们读到内存中,当内存不足的时候,内核就释放它们到空闲列表,当程序再次需要它们的时候需要通过缺页中断再次读到内存。
    • Dirty pages,脏页,指那些在内存中被修改过的数据页,比如文本文件等。这些文件由 pdflush 负责同步到硬盘,内存不足的时候由 kswapd 和 pdflush 把数据写回硬盘并释放内存。
    • Anonymous pages,匿名页,那些属于某个进程但是又和任何文件无关联,不能被同步到硬盘上,内存不足的时候由 kswapd 负责将它们写到交换分区并释放内存。
    IOPS  (IO’s Per Second)

    IOPS (Input/Output Per Second) 即每秒的输入输出量(或读写次数),是衡量磁盘性能的主要指标之一。IOPS是指单位时间内系统能处理的I/O请求数量,一般以每秒处理的I/O请求数量为单位,I/O请求通常为读或写数据操作请求。

    每秒IO请求数,这么查看呢?iostat 参数 -d 表示,显示设备(磁盘)使用状态;-k某些使用block为单位的列强制使用Kilobytes为单位;

    io

    • tps 即为 IOPS 该设备每秒的传输次数(Indicate the number of transfers per second that were issued to the device.)。”一次传输”意思是”一次I/O请求”。多个逻辑请求可能会被合并为”一次I/O请求”。”一次传输”请求的大小是未知的。
    •  kB_read/s:每秒从设备(drive expressed)读取的数据量;
    • kB_wrtn/s:每秒向设备(drive expressed)写入的数据量;
    • kB_read:读取的总数据量;
    • kB_wrtn:写入的总数量数据量;这些单位都为Kilobytes。

    顺序 IO 和 随机 IO

    IO 可分为顺序 IO 和 随机 IO 两种,性能监测前需要弄清楚系统偏向顺序 IO 的应用还是随机 IO 应用。顺序 IO 是指同时顺序请求大量数据,比如数据库执行大量的查询、流媒体服务等,顺序 IO 可以同时很快的移动大量数据。

    iostat还有一个比较常用的选项-x,该选项将用于显示和io相关的扩展数据。

    io

    • rrqm/s:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge);
    • wrqm/s:每秒这个设备相关的写入请求有多少被Merge了。
    •  rsec/s:每秒读取的扇区数;
    • wsec/:每秒写入的扇区数。
    •  rKB/s:The number of read requests that were issued to the device per second;
    • wKB/s:The number of write requests that were issued to the device per second;
    • avgrq-sz 平均请求扇区的大小 avgqu-sz 是平均请求队列的长度。毫无疑问,队列长度越短越好。
    •  await: 每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。 这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。
    • svctm 表示平均每次设备I/O操作的服务时间(以毫秒为单位)。如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长, 系统上运行的应用程序将变慢。
    • %util: 在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。

    在这里引入两个概念:一个是IOPS即每秒能处理IO数,另一个是IO的吞吐能力即 KB per IO 这两个参数都可以说明磁盘的性能。 前一个我们可以直接参考iostat的tps参数。前面已经提到过。那么第二个参数怎么获取呢?

    rKB/s   除以  r/s 则为第二个参数的值。

    SWAP

    当系统没有足够物理内存来应付所有请求的时候就会用到 swap 设备,swap 设备可以是一个文件,也可以是一个磁盘分区。不过要小心的是,使用 swap 的代价非常大。如果系统没有物理内存可用,就会频繁 swapping,如果 swap 设备和程序正要访问的数据在同一个文件系统上,那会碰到严重的 IO 问题,最终导致整个系统迟缓,甚至崩溃。swap 设备和内存之间的 swapping 状况是判断 Linux 系统性能的重要参考,我们已经有很多工具可以用来监测 swap 和 swapping 情况,比如:top、cat /proc/meminfo、vmstat 等。

    注:上面的内容比较散乱,主要是由于我自身对IO概念的理解有限,能力不足导致的。还有多数内容是摘自网上,后面应该尽量去结合实际的运维案例去深入了解分析。

  • Linux系统查看——内存

    背景:

    内存与CPU一样都是非常重要的系统信息,管理员应该随时关注。并且出问题以后应该分析的能力。

    概念:

    这里的讲到的 “内存” 包括物理内存和虚拟内存,虚拟内存(Virtual Memory)把计算机的内存空间扩展到硬盘,物理内存(RAM)和硬盘的一部分空间(SWAP)组合在一起作为虚拟内存为计算机提供了一个连贯的虚拟内存空间,好处是我们拥有的内存 ”变多了“,可以运行更多、更大的程序,坏处是把部分硬盘当内存用整体性能受到影响,硬盘读写速度要比内存慢几个数量级,并且 RAM 和 SWAP 之间的交换增加了系统的负担。在操作系统里,虚拟内存被分成页,在 x86 系统上每个页大小是 4KB。Linux 内核读写虚拟内存是以 “页” 为单位操作的,把内存转移到硬盘交换空间(SWAP)和从交换空间读取到内存的时候都是按页来读写的。

    Linux 利用虚拟内存极大的扩展了程序地址空间,使得原来物理内存不能容下的程序也可以通过内存和硬盘之间的不断交换(把暂时不用的内存页交换到硬盘,把需要的内存页从硬盘读到内存)来赢得更多的内存,看起来就像物理内存被扩大了一样。事实上这个过程对程序是完全透明的,程序完全不用理会自己哪一部分、什么时候被交换进内存,一切都有内核的虚拟内存管理来完成。当程序启动的时候,Linux 内核首先检查 CPU 的缓存和物理内存,如果数据已经在内存里就忽略,如果数据不在内存里就引起一个缺页中断(Page Fault),然后从硬盘读取缺页,并把缺页缓存到物理内存里。缺页中断可分为主缺页中断(Major Page Fault)和次缺页中断(Minor Page Fault),要从磁盘读取数据而产生的中断是主缺页中断;数据已经被读入内存并被缓存起来,从内存缓存区中而不是直接从硬盘中读取数据而产生的中断是次缺页中断。

    上面的内存缓存区起到了预读硬盘的作用,内核先在物理内存里寻找缺页,没有的话产生次缺页中断从内存缓存里找,如果还没有发现的话就从硬盘读取。很显然,把多余的内存拿出来做成内存缓存区提高了访问速度,这里还有一个命中率的问题,运气好的话如果每次缺页都能从内存缓存区读取的话将会极大提高性能。要提高命中率的一个简单方法就是增大内存缓存区面积,缓存区越大预存的页面就越多,命中率也会越高。

    以上部分特别重要,对深刻理解内存知识具有重要作用。

    内容:

    一、查看当前系统的内存状态,用于紧急定位处理:

    最常用的命令应该就是free了,本来已经写了半天,然后再网上随便一翻,发现很多精贴,于是赶紧删了,不敢丢人了,下面这位就写的很不错,简单明了,一看就懂:http://www.cnblogs.com/coldplayerest/archive/2010/02/20/1669949.html

    二、查看系统的历史内存状态,用于故障分析等:

    每10秒采样一次,连续采样3次,监控内存状态:

    sar -r 10 3

    sar

    这里的free和userd等和free命令里的从操作系统角度来看的结果是一样的

    kbmemfree:这个值和free命令中(第一行)的free值基本一致,所以它不包括buffer和cache的空间.

    kbmemused:这个值和free命令中(第一行)的used值基本一致,所以它包括buffer和cache的空间.

    %memused:这个值是kbmemused和内存总量(不包括swap)的一个百分比.

    kbbuffers和kbcached:这两个值就是free命令中的buffer(写到disk)和cache(从disk读).

    kbcommit:保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap).

    %commit:这个值是kbcommit与内存总量(包括swap)的一个百分比.

    3. 监控内存分页

    sar

    输出项说明:

    pgpgin/s:表示每秒从磁盘或SWAP置换到内存的字节数(KB)

    pgpgout/s:表示每秒从内存置换到磁盘或SWAP的字节数(KB)

    fault/s:每秒钟系统产生的缺页数,即主缺页与次缺页之和(major + minor)

    majflt/s:每秒钟产生的主缺页数.

    pgfree/s:每秒被放入空闲队列中的页个数

    pgscank/s:每秒被kswapd扫描的页个数

    pgscand/s:每秒直接被扫描的页个数

    pgsteal/s:每秒钟从cache中被清除来满足内存需要的页个数

    %vmeff:每秒清除的页(pgsteal)占总扫描页(pgscank+pgscand)的百分比

     

  • Linux系统状态查看——CPU

    背景

    你爱或不爱,我就在那里不悲不喜。 作为一个linux系统管理员,你牛或不牛,最基本的linux状态查看你得知道,这是定位和分析问题的基础,但往往被很多人忽略。作为一个入职不久的新人,我觉得拥有一套清晰的查看与分析问题的思路和方法是至关重要的。这篇文章作为以后经常翻阅与更新的自备手册。

    重要概念

    CPU 也是一种硬件资源,和任何其他硬件设备一样也需要驱动和管理程序才能使用,我们可以把内核的进程调度看作是 CPU 的管理程序,用来管理和分配 CPU 资源,合理安排进程抢占 CPU,并决定哪个进程该使用 CPU、哪个进程该等待。操作系统内核里的进程调度主要用来调度两类资源:进程(或线程)和中断,进程调度给不同的资源分配了不同的优先级,优先级最高的是硬件中断,其次是内核(系统)进程,最后是用户进程。每个 CPU 都维护着一个可运行队列,用来存放那些可运行的线程。线程要么在睡眠状态(blocked 正在等待 IO)要么在可运行状态,如果 CPU 当前负载太高而新的请求不断,就会出现进程调度暂时应付不过来的情况,这个时候就不得不把线程暂时放到可运行队列里。CPU 很无辜,是个任劳任怨的打工仔,每时每刻都有工作在做(进程、线程)并且自己有一张工作清单(可运行队列),由老板(进程调度)来决定他该干什么,他需要和老板沟通以便得到老板的想法并及时调整自己的工作(上下文切换),部分工作做完以后还需要及时向老板汇报(中断),所以打工仔(CPU)除了做自己该做的工作以外,还有大量时间和精力花在沟通和汇报上。如果你是老板,你如何检查打工仔的效率(性能)呢?我们一般会通过以下这些信息来判断打工仔是否偷懒:

    • 打工仔接受和完成多少任务并向老板汇报了(中断);
    • 打工仔和老板沟通、协商每项工作的工作进度(上下文切换);
    • 打工仔的工作列表是不是都有排满(可运行队列);
    • 打工仔工作效率如何,是不是在偷懒(CPU 利用率)。

    现在把打工仔换成 CPU,我们可以通过查看这些重要参数:中断、上下文切换、可运行队列、CPU 利用率来监测 CPU 的性能。

    那么监测 CPU 性能的底线是什么呢?通常我们期望我们的系统能到达以下目标:

    • CPU 利用率,如果 CPU 有 100% 利用率,那么应该到达这样一个平衡:65%-70% User Time,30%-35% System Time,0%-5% Idle Time;
    • 上下文切换,上下文切换应该和 CPU 利用率联系起来看,如果能保持上面的 CPU 利用率平衡,大量的上下文切换是可以接受的;
    • 可运行队列,每个可运行队列不应该有超过1-3个线程(每处理器),比如:双处理器系统的可运行队列里不应该超过6个线程。

    内容

    一. 查看CPU信息(型号)

    $ lscpu

    • Architecture:          x86_64                               #CPU架构为x86的64位
    • CPU op-mode(s):        32-bit, 64-bit
    • Byte Order:            Little Endian
    • CPU(s):                40                                        #CPU线程总数
    • On-line CPU(s) list:   0-39
    • Thread(s) per core:    2                                    #每个核上的CPU线程数 (开启超线程选项后为2)
    • Core(s) per socket:    10                                  #每个物理CPU处理器上的核数
    • Socket(s):             2                                         #物理CPU处理器的个数
    • NUMA node(s):          2
    • Vendor ID:             GenuineIntel
    • CPU family:            6
    • Model:                 63
    • Stepping:              2
    • CPU MHz:               2600.034
    • BogoMIPS:              5199.24
    • Virtualization:        VT-x
    • L1d cache:             32K
    • L1i cache:             32K
    • L2 cache:              256K
    • L3 cache:              25600K
    • NUMA node0 CPU(s):     0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38
    • NUMA node1 CPU(s):     1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39

    上面的配置用一句话来总结即为:主板上有两个物理CPU,每个物理CPU上有10个核,每个核上有两个线程。

    二. 查看当前CPU的信息

    要查看目前导致系统CPU负载很高是由什么造成的,然后进行紧急优化处理。这时候,我觉得top命令是最方便实用的,它的功能尤其强大,是分析各种状态信息的良器,这里我只做关键常用的一个概述,其他的可以在用起来的时候man来查看搜索。

    cpu

    前五行是系统整体的信息统计,我们逐一来看。

    1. 第一行等价于uptime的命令结果

    $ uptime

    10:41:11 up 9 days, 19:37,  1 user,  load average: 0.00, 0.05, 0.01

    当前时间(10:41:11)  +   系统运行时间(9 days) + 当前登陆人数(1) + 任务队列长度。

    这里着重说一下这个load average的含义:很多资料都简单说是”系统负载,即任务队列的平均长度。 三个数值分别为  1分钟、5分钟、15分钟前到现在的平均值“。那么什么是任务队列,相对于谁的任务队列,多少是高,多少是正常,其实很多人并不知道。 数字越高,说明服务器的负载越 大,这也可能是服务器出现某种问题的信号。

    而事实不完全如此,是什么因素构成了负载均值的大小,以及如何区分它们目前的状况是 “好”还是“糟糕”?什么时候应该注意哪些不正常的数值?回答这些问题之前,首先需要了解下这些数值背后的些知识。我们先用最简单的例子说明, 一台只配备一块单核处理器的服务器。行车过桥:

    一只单核的处理器可以形象得比喻成一条单车道。设想下,你现在需要收取这条道路的过桥 费 ? 忙于处理那些将要过桥的车辆。你首先当然需要了解些信息,例如车辆的载重、以及 还有多少车辆正在等待过桥。如果前面没有车辆在等待,那么你可以告诉后面的司机通过。 如果车辆众多,那么需要告知他们可能需要稍等一会。因此,需要些特定的代号表示目前的车流情况,例如:

    0.00 表示目前桥面上没有任何的车流。 实际上这种情况与 0.00 和 1.00 之间是相同的,总而言之很通畅,过往的车辆可以丝毫不用等待的通过。

    1.00 表示刚好是在这座桥的承受范围内。 这种情况不算糟糕,只是车流会有些堵,不过这种情况可能会造成交通越来越慢。

    超过 1.00,那么说明这座桥已经超出负荷,交通严重的拥堵。 那么情况有多糟糕? 例如 2.00 的情况说明车流已经超出了桥所能承受的一倍,那么将有多余过桥一倍的车辆正在焦急的等待。3.00 的话情况就更不妙了,说明这座桥基本上已经快承受不了,还有超出桥负载两倍多的车辆正在等待。上面的情况和处理器的负载情况非常相似。一辆汽车的过桥时间就好比是处理器处理某线程 的实际时间。Unix 系统定义的进程运行时长为所有处理器内核的处理时间加上线程 在队列中等待的时间。和收过桥费的管理员一样,你当然希望你的汽车(操作)不会被焦急的等待。所以,理想状态 下,都希望负载平均值小于 1.00 。当然不排除部分峰值会超过 1.00,但长此以往保持这 个状态,就说明会有问题,这时候你应该会很焦急。

    “所以你说的理想负荷为 1.00 ?”

    嗯,这种情况其实并不完全正确。负荷 1.00 说明系统已经没有剩余的资源了。在实际情况中 ,有经验的系统管理员都会将这条线划在 0.70:

    “需要进行调查法则”: 如果长期你的系统负载在 0.70 上下,那么你需要在事情变得更糟糕之前,花些时间了解其原因。

    “现在就要修复法则”:1.00 。 如果你的服务器系统负载长期徘徊于 1.00,那么就应该马上解决这个问题。否则,你将半夜接到你上司的电话,这可不是件令人愉快的事情。

    “凌晨三点半锻炼身体法则”:5.00。 如果你的服务器负载超过了 5.00 这个数字,那么你将失去你的睡眠,还得在会议中说明这情况发生的原因,总之千万不要让它发生。

    那么多个处理器呢?我的均值是 3.00,但是系统运行正常!

    哇喔,你有四个处理器的主机?那么它的负载均值在 3.00 是很正常的。

    在多处理器系统中,负载均值是基于内核的数量决定的。以 100% 负载计算,1.00 表示单个处理器,而 2.00 则说明有两个双处理器,那么 4.00 就说明主机具有四个处理器。

    回到我们上面有关车辆过桥的比喻。1.00 我说过是“一条单车道的道路”。那么在单车道 1.00 情况中,说明这桥梁已经被车塞满了。而在双处理器系统中,这意味着多出了一倍的 负载,也就是说还有 50% 的剩余系统资源 ? 因为还有另外条车道可以通行。所以,单处理器已经在负载的情况下,双处理器的负载满额的情况是 2.00,它还有一倍的资源可以利用。

    那么,怎么会有三个数字的确让人困扰。我们知道,0.65、0.42、0.36 分别说明上一分钟、最后五分钟以及最后十五分钟的系统负载均值。那么这又带来了一个问题:

    我们以哪个数字为准?一分钟?五分钟?还是十五分钟?

    其实对于这些数字我们已经谈论了很多,我认为你应该着眼于五分钟或者十五分钟的平均数 值。坦白讲,如果前一分钟的负载情况是 1.00,那么仍可以说明认定服务器情况还是正常的。 但是如果十五分钟的数值仍然保持在 1.00,那么就值得注意了(根据我的经验,这时候你应 该增加的处理器数量了)。

    2. 第二行标识进程和CPU的信息,都很容易看懂,这里我只说进程状态标志

    D=不可中断的睡眠状态    R=运行    S=睡眠    T=跟踪/停止    Z=僵尸进程

    3. 第三行表示CPU的使用率也很简单

    -us:用户进程消耗的CPU时间百分比 (us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超50%的使用,那么我们就该考虑优化程序算法)
    -sy:内核进程消耗的CPU时间百分比(sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因)
    -wa:IO等待消耗的CPU时间百分比(wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈,如块操作)。
    -id:CPU处于空闲状态时间百分比,如果空闲时间(cpu id)持续为0并且系统时间(cpu sy)是用户时间的两倍(cpu us) 系统则面临着CPU资源的短缺。

    4. 第四行和 free -m命令的结果类似,是从系统的角度看内存,第四行的free + 第四行的buffers + 第五行的cached,按这个公式此台服务器的可用内存。

    5. 第五行是交换区内存使用情况。

    接下来是正文信息部分:

    %e5%b1%8f%e5%b9%95%e5%bf%ab%e7%85%a7-2016-10-18-%e4%b8%8b%e5%8d%888-02-40

    top命令格式浅析:

    top [-] [d] [p] [q] [c] [C] [S] [n]

    参数说明:

    • d:  指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变之。
    • p:  通过指定监控进程ID来仅仅监控某个进程的状态。
    • q:该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行。
    • S: 指定累计模式
    • s : 使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。
    • i:  使top不显示任何闲置或者僵死进程。
    • c:  显示整个命令行而不只是显示命令名

    不建议使用top做修改性操作,做好是用于查询和分析

    下面是和top程序的一些交互命令,如果应用合理是非常方便的:

    1. 在top基本视图中,按键盘数字“1”,可监控每个逻辑CPU的状况,这里的CPU指的是逻辑CPU,如果你开超线程了的话,一般是CPU核心数量的两倍。

    2. 默认进入top时,各进程是按照CPU的占用量来排序的,可通过键盘指令来改变排序字段,比如想监控哪个进程占用MEM最多,通过”shift + >”或”shift + <”可以向右或左改变排序列

    ——  Ctrl+L 擦除并且重写屏幕。

    •  h或者? 显示帮助画面,给出一些简短的命令总结说明。
    •  k 终止一个进程。系统将提示用户输入需要终止的进程PID,以及需要发送给该进程什么样的信号。一般的终止进程可以使用15信号;如果不能正常结束那就使用信号9强制结束该进程。默认值是信号15。在安全模式中此命令被屏蔽。
    •  i 忽略闲置和僵死进程。这是一个开关式命令。
    •  q 退出程序。 r 重新安排一个进程的优先级别。系统提示用户输入需要改变的进程PID以及需要设置的进程优先级值。输入一个正值将使优先级降低,反之则可以使该进程拥有更高的优先权。默认值是10。
    • S 切换到累计模式。
    •  s 改变两次刷新之间的延迟时间。系统将提示用户输入新的时间,单位为s。如果有小数,就换算成m s。输入0值则系统将不断刷新,默认值是5 s。需要注意的是如果设置太小的时间,很可能会引起不断刷新,从而根本来不及看清显示的情况,而且系统负载也会大大增加。
    •  f或者F 从当前显示中添加或者删除项目。 o或者O 改变显示项目的顺序。 l 切换显示平均负载和启动时间信息。
    •  m 切换显示内存信息。
    •  t 切换显示进程和CPU状态信息。
    • c 切换显示命令名称和完整命令行。
    •  M 根据驻留内存大小进行排序。
    •  P 根据CPU使用百分比大小进行排序。
    • T 根据时间/累计时间进行排序。
    • W 将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法。

    查看CPU状态的历史信息

    有时候我们需要查看过去一天的某个时间段内的CPU等信息状态,来定位一些问题,这时候我觉得sar命令是最合适方便的选择。sar(System Activity Reporter系统活动情况报告)是目前 Linux上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程活动及IPC有关的活动等。

    • -A:所有报告的总和
    • -u:输出CPU
    • 使用情况的统计信息
    • -v:输出inode、文件和其他内核表的统计信息
    • -d:输出每一个块设备的活动信息
    • -r:输出内存
    • 和交换空间的统计信息
    • -b:显示I/O
    • 和传送速率的统计信息
    • -a:文件读写情况
    • -c:输出进程统计信息,每秒创建的进程数
    • -R:输出内存页面的统计信息
    • -y:终端设备活动情况
    • -w:输出系统交换活动信息

    输出项说明:

    CPU:all 表示统计信息为所有 CPU 的平均值。

    %user:显示在用户级别(application)运行使用 CPU 总时间的百分比。

    %nice:显示在用户级别,用于nice操作,所占用 CPU 总时间的百分比。

    %system:在核心级别(kernel)运行所使用 CPU 总时间的百分比。

    %iowait:显示用于等待I/O操作占用 CPU 总时间的百分比。

    %steal:管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。

    %idle:显示 CPU 空闲时间占用 CPU 总时间的百分比。

    1. 若 %iowait 的值过高,表示硬盘存在I/O瓶颈

    2. 若 %idle 的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量

    3. 若 %idle 的值持续低于1,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU 。

    如果要查看二进制文件test中的内容,需键入如下sar命令:

    sar -u -f /var/log/sa/sar28

     

    参考:

    http://os.51cto.com/art/201012/239880.htm

  • Linux系统启动流程

    前言

    我们都知道,Linux是一套多用户,多任务的操作系统。他的开机启动与关机停止都是不同于Windows的。例如,一台Linux上可能登陆有好几个用户同时,如果你“自私”的用完就关机了,那别人可能就要哭瞎了。 学习Linux,对它的系统启动和关机流程还是应该有一定的了解,这是基本的要求。

    基本概念

    相信大家都学习过计算机基础概论这门课吧,虽然当时我们有认真听,但也隐约有个映像,记得有两个东西:一个叫CMOS,还有一个叫BIOS。那么这两个东西是什么呢?它又和我们的主题系统启动有什么关系呢?——问度娘:

    BIOS是英文”Basic Input Output System”的缩略词,直译过来后中文名称就是”基本输入输出系统”。其实,它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序,它可从CMOS中读写系统设置的具体信息。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。BIOS设置程序是储存在BIOS芯片中的,BIOS芯片是主板上一块长方形或正方形芯片,只有在开机时才可以进行设置。(一般在计算机启动时按F2或者Delete进入BIOS进行设置,一些特殊机型按F1、Esc、F12等进行设置)。BIOS设置程序主要对计算机的基本输入输出系统进行管理和设置,使系统运行在最好状态下,使用BIOS设置程序还可以排除系统故障或者诊断系统问题。有人认为既然BIOS是”程序”,那它就应该是属于软件,感觉就像自己常用的Word或Excel。但也有很多人不这么认为,因为它与一般的软件还是有一些区别,而且它与硬件的联系也是相当地紧密。形象地说,BIOS应该是连接软件程序与硬件设备的一座”桥梁”,负责解决硬件的即时要求。

    好长一大串,我们只需要记住最后一句即可。接下来看看CMOS:

    在计算机领域,CMOS常指保存计算机基本启动信息(如日期、时间、启动设置等)的芯片。有时人们会把CMOS和BIOS混称,其实CMOS是主板上的一块可读写的并行或串行FLASH芯片,是用来保存BIOS的硬件配置和用户对某些参数的设定。这个熟悉的界面。

    xx

    太啰嗦了?那还是用一张图来说明一下吧:

    xx

    Linux系统启动流程:

    第一步:首先去加载BIOS,并通过BIOS程序去加载CMOS的信息,并且通过CMOS内的设置取得主机的各项硬件信息,然后BIOS会进行一个开机自检,当BIOS自检OK后,它就“自私的”把流程转交给MBR了。MBR作为主引导分区,它里面有个引导装载程序(Boot Loader(现在比较常用的如grub)),只有这哥们认识“内核文件Kernel ”,它就把内核文件给load进来了。

    那么问题来了,你说MBR里才有这个Boot 哥,而MBR是每个磁盘都有一个的,那我应该找哪个磁盘的MBR呢?还有,假如我安装的是双系统,那么我必须使用自己的Loader才能找到自己的Kernel,而MBR只有一个,我其他的Loader放哪里啊?

    1. BIOS是可以设置去哪块磁盘上取MBR的。

    2. 其实每个文件系统都会另外有一个叫boot sector的地方来存放属于自己的boot loader。对于Windows来说它默认将MBR和boot sector中都保存一份boot loader,而linux则随意你设置。

    xx

    如图,整个系统的MBR就只有一个,而每个文件系统都又有自己的一个boot sector。

    那么问题又来了,不管怎么说,BIOS它只认识MBR,而我们的MBR只有一个,而MBR里面只有一个boot loader ,那如果我想用其他的boot loader怎么办? —— 这就要说说这个神通广大的boot loader了,我们以grub为例,它有如下功能:

    —— 提供菜单:用户可以选择不同的启动选项,这下知道开机让你选择linux 或window是谁干的了吧?

    ——加载内核文件:之前说了,只有他认识kernel

    ——转交其他loader:这就是问题的答案,它可以在你从提供菜单里选定后直接转交给对应的loader,让它来加载对应的kernel。

    xx

    如图:MBR里的grub (boot loader)给你提供了三个菜单选项。我们来看一下这个强大的grub:

    vim /boot/grub/grub.conf

    xx

    ——  default=1代表的是选择第几个配置,下面的每一个titile 代表一个操作系统的配置信息,如果有多个操作系统信息,则下面就会有多个titile,这里default=1,表示默认使用第二个操作系统的配置,也就是使用第二个title  SinaLinux。

    —— timeout=5,表示刚进入系统时默认等待的时间,这个我们可以修改,如果将其修改成0,则系统直接进入引导。

    —— splashimage=(hd0,0)/boot/grub/splash.xpm.gz表示的是倒计时界面下,页面显示的背景图片。

    ——hiddenmenu表示隐藏菜单。

    —— title表示每一个操作系统的配置,后面跟的就是操作系统的名字,这个可以自己随便取名下面的。

    ①root (hd0,0)

    表示操作系统的 /boot 分区所在硬盘的分区,hd0,0表示第一块硬盘的第一个分区,我们当前操作系统的/boot分区就是在这个分区下。

    ②kernel 这个表示的是操作系统的内核存放位置,当前的CentOS操作系统的内核就是存放着 /boot 目录下的vmlinuz-2.6.18-164..el5, 后面跟的是内核的参数,ro表示只读的,每一个参数都用空格隔开。

    ③initrd : Linux为什么启动的速度那么快,是因为其操作系统的内核非常的精简,为了让Linux的内核保持精简,我们就将其不常用的驱动、功能编译为模块,在需要的时候对其进行动态加载。所以这个initrd就是存放的是我们的那些不常用的驱动、功能所编译成的模块。之前的Linux版本里面使用的是initrd文件,initramfs是initrd的一个替代优化版本,比initrd更加节省空间、更加灵活。所以现在的Linux版本都是用的是initramfs。我们如果有多个操作系统的配置信息的话,就要在下面再定义一个title,然后按照上面的格式,定义好/boot分区的目录以及内核的目录等

    第二步:当grub读取kernel后,Linux就会将内核解压缩到内存当中,并且利用内核的功能,开始再进行一遍硬件等检测。还有一步驱动程序加载我们这里不介绍了。然后内核就全面接管接下里的操作了。我们来看一下内核文件在哪?

    xx

    第三步:在内核加载完毕接管整个过程后,第一件事就是主动调用一个进程—— /sbin/init进程,这个进程的PID为1.它的主要功能就是准备软件的执行环境,包括系统的主机名,网络设置,语系处理,文件系统格式及其他服务的启动。我们来验证一下:

    xx

    我们看到操作系统运行的第一个进程就是 init 进程,这个进程在启动以后就会一直运行,直到系统退出关机。init的配置文件/etc/initab来规划init的所有行动,我们来看一下这个文件的部分内容:

    xx

    —— id:3:initdefault:       ==》   默认的runlevel设置,这里为3

    —— si::sysinit:/etc/rc.d/rc.sysinit      ==》      准备系统执行的环境的脚本执行文件

    —— l0:0:wait:/etc/rc.d/rc 0         ==》    不同的runlevel的需要启动时执行的环境脚本

    其余的我就不一一说明了,这里列出此配置文件里的参数含义:

    xx

    那么不同的runlevel又代表什么不同的含义呢?(额  用Xmind画的图导出后有些模糊)

    xx

    我们通过 runlevel 命令可以查看我们当前的以及上一次的启动级别,也可以通过 init + 数字的方式来进入某个runlevel级别。每个运行级别启动时的对应启动服务都是保存在了 /etc/rc.d/rc[0123456].d中,例如我们当前的运行级别是3,则操作系统的启动服务就是在 /etc/rc.d/rc3.d这个目录下,里面都是运行级别3所需启动的服务。

    xx

    上面这些文件其实全部都是链接文件,它是链接到 /etc/init.d/服务名  启动脚本的! 所以说,我们开机启动文件其实就相当于将此目录下链接到/etc/init.d/下对应的的文件都执行一遍start   !!!!  那假如我想把某个服务设置为开机自启动岂不是还要用连接命令?   不用,我们平常使用的sysconfig  命令就是干这个的。  

    在这里提出一个需求:假如我想在系统启动后自动执行一系列操作,比如发个邮件给我自己,说启动成功了,这个功能又不是一个服务,怎么设置开机自动执行呢?  直接将它写入  /etc/rc.d/rc.local 即可。

    到此为止,这时候我们的Linux应该就顺利的开跑了!