存档

文章标签 ‘linux’

vmstat 输出解析

2008年8月12日 没有评论
 

  Procs
  r: 等待运行的进程数 b: 处在非中断睡眠状态的进程数 w: 被交换出去的可运行的进程数。此数由 linux 计算得出,但 linux 并不耗尽交换空间
  Memory
  swpd: 虚拟内存使用情况,单位:KB
  free: 空闲的内存,单位KB
  buff: 被用来做为缓存的内存数,单位:KB
  Swap
  si: 从磁盘交换到内存的交换页数量,单位:KB/秒
  so: 从内存交换到磁盘的交换页数量,单位:KB/秒
  IO
  bi: 发送到块设备的块数,单位:块/秒
  bo: 从块设备接收到的块数,单位:块/秒
  System
  in: 每秒的中断数,包括时钟中断
  cs: 每秒的环境(上下文)切换次数
  CPU
  按 CPU 的总使用百分比来显示
  us: CPU 使用时间
  sy: CPU 系统使用时间
  id: 闲置时间
  准测
  r<5,b≈0,
  如果fre  对于page列,re,pi,po,cy维持于比较稳定的状态,PI率不超过5,如果有pagin发生,那么关联页面必须先进行pageout在内存相对紧张的环境下pagein会强制对不同的页面进行steal操作。如果系统正在读一个大批的永久页面,你也许可以看到po和pi列会出现不一致的增长,这种情景并不一定表明系统负载过重,但是有必要对应用程序的数据访问模式进行见检查。在稳定的情况下,扫描率和重置率几乎相等,在多个进程处理使用不同的页面的情况下,页面会更加不稳定和杂乱,这时扫描率可能会比重置率高出。
  faults列,in,sy,cs会不断跳跃,这里没有明确的限制,唯一的就是这些值最少大于100 cpu列,us,sys,id和wa也是不确定的,最理想的状态是使cpu处于100%工作状态,单这只适合单用户的情况下。
如果在多用户环境中us+sys》80,进程就会在运行队列中花费等待时间,响应时间和吞吐量就会下降。wa>40表明磁盘io没有也许存在不合理的平衡,或者对磁盘操作比较频繁,vmstat各项:
 
  如果 r经常大于 4 ,且id经常少于40,表示cpu的负荷很重。
  如果pi,po 长期不等于0,表示内存不足。
  如果disk 经常不等于0, 且在 b中的队列 大于3, 表示 io性能不好。
procs: r–>在运行队列中等待的进程数 b–>在等待io的进程数 w–>可以进入运行队列但被替换的进程 memoy swap–>现时可用的交换内存(k表示) free–>空闲的内存(k表示) pages re--》回收的页面 mf--》非严重错误的页面 pi--》进入页面数(k表示) po--》出页面数(k表示) fr--》空余的页面数(k表示) de--》提前读入的页面中的未命中数 sr--》通过时钟算法扫描的页面 disk 显示每秒的磁盘操作。 s表示scsi盘,0表示盘号 fault 显示每秒的中断数 in--》设备中断 sy--》系统中断 cy--》cpu交换 cpu 表示cpu的使用状态 cs--》用户进程使用的时间 sy--》系统进程使用的时间 id--》cpu空闲的时间

 

  Linux在具有高稳定性、可靠性的同时,具有很好的可伸缩性和扩展性,能够针对不同的应用和硬件环境调整,优化出满足当前应用需要的最佳性能。因此企业在维护Linux系统、进行系统调优时,了解系统性能分析工具是至关重要的。
  在Linux下有很多系统性能分析工具,比较常见的有top、free、ps、time、timex、uptime等。下文将介绍几个较为重要的性能分析工具vmstat、iostat和sar及其使用。

  用vmstat监视内存使用情况

  vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监视。它是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。

  vmstat的语法如下:

  vmstat [-V] [-n] [delay [count]]
  其中,-V表示打印出版本信息;-n表示在周期性循环输出时,输出的头部信息仅显示一次;delay是两次输出之间的延迟时间;count是指按照这个时间间隔统计的次数。对于vmstat输出各字段的含义,可运行man vmstat查看。

  用iostat监视I/O子系统情况

  iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。同vmstat一样,iostat也有一个弱点,就是它不能对某个进程进行深入分析,仅对系统的整体情况进行分析。

  iostat的语法如下:

iostat [ -c | -d ] [ -k ] [ -t ] [ -V ] [ -x [ device ] ] [ interval [ count ] ]
  其中,-c为汇报CPU的使用情况;-d为汇报磁盘的使用情况;-k表示每秒按kilobytes字节显示数据;-t为打印汇报的时间;-v表示打印出版本信息和用法;-x device指定要统计的设备名称,默认为所有的设备;interval指每次统计间隔的时间;count指按照这个时间间隔统计的次数。

  iostat一般的输出格式如下:

Linux 2.4.18-18smp (builder.linux.com)  2003年03月07日
 
avg-cpu:  %user   %nice    %sys   %idle
           4.81    0.01    1.03   94.15
 
Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
dev3-0           30.31      1117.68       846.52   16104536   12197374
dev3-1            7.06       229.61        40.40    3308486     582080

  对于输出中各字段的含义,iostat的帮助中有详细的说明。

  使用sar进行综合分析

  表1 sar参数说明

  选项 功能

  -A 汇总所有的报告

  -a 报告文件读写使用情况

  -B 报告附加的缓存的使用情况

  -b 报告缓存的使用情况

  -c 报告系统调用的使用情况

  -d 报告磁盘的使用情况

  -g 报告串口的使用情况

  -h 报告关于buffer使用的统计数据

  -m 报告IPC消息队列和信号量的使用情况

  -n 报告命名cache的使用情况

  -p 报告调页活动的使用情况

  -q 报告运行队列和交换队列的平均长度

  -R 报告进程的活动情况

  -r 报告没有使用的内存页面和硬盘块

  -u 报告CPU的利用率

  -v 报告进程、i节点、文件和锁表状态

  -w 报告系统交换活动状况

  -y 报告TTY设备活动状况

  sar是System Activity Reporter(系统活动情况报告)的缩写。顾名思义,sar工具将对系统当前的状态进行取样,然后通过计算数据和比例来表达系统的当前运行状态。它的特点是可以连续对系统取样,获得大量的取样数据;取样数据和分析的结果都可以存入文件,所需的负载很小。sar是目前Linux上最为全面的系统性能分析工具之一,可以从14个大方面对系统的活动进行报告,包括文件的读写情况、系统调用的使用情况、串口、CPU效率、内存使用状况、进程活动及IPC有关的活动等,使用也是较为复杂。

  sar的语法如下:

sar [-option] [-o file] t [n]

  它的含义是每隔t秒取样一次,共取样n次。其中-o file表示取样结果将以二进制形式存入文件file中。

  另一种语法如下:

sar [-option] [-s time] [-e time] [-i sec] [-f file]
  含义是表示从file文件中取出数据,如果没有指定-f file,则从标准数据文件/var/adm/sa/sadd取数据,其中dd表示当前天。另外,-s time表示起始时间;-e time表示停止时间;-i sec表示取样的时间间隔,如果不指定则表示取文件中所有的数据。对于具体的选项参见表1。

  一般它与-q和-u联合使用,以便对每个CPU的使用情况进行分析,比如运行如下命令:

sar  -q -u 5 1
  将输出如下:
Linux 2.4.18-18smp (builder.linux.com)        2003年03月07日
 
09时46分16?      CPU     %user     %nice   %system     %idle
09时46分21?      all      0.20      0.00      0.00     99.80
 
09时46分16?  runq-sz  plist-sz   ldavg-1   ldavg-5
09时46分21?        0        91      0.00      0.00
 
Average:          CPU     %user     %nice   %system     %idle
Average:          all      0.20      0.00      0.00     99.80
 
Average:      runq-sz  plist-sz   ldavg-1   ldavg-5
Average:            0        91      0.00      0.00

  由于sar命令太复杂,只有通过熟练使用才能了解每个选项的含义,对于sar输出中每个字段的含义运行man sar命令可以得到详细的解释。

 

 

 

分类: 只谈技术 标签: ,

iostat 输出解析

2008年8月12日 没有评论

1. /proc/partitions

iostat 的数据的主要来源是 /proc/partitions,所以需要先看看
/proc/partitions 中有些什么。

# cat /proc/partitions
major minor  #blocks  name     rio rmerge rsect ruse wio wmerge wsect wuse running use aveq

  3     0   19535040 hda 12524 31127 344371 344360 12941 25534 308434 1097290 -1 15800720 28214662
  3     1    7172991 hda1 13 71 168 140 0 0 0 0 0 140 140
  3     2          1 hda2 0 0 0 0 0 0 0 0 0 0 0
  3     5    5116671 hda5 100 477 665 620 1 1 2 30 0 610 650
  3     6     265041 hda6 518 92 4616 2770 257 3375 29056 143880 0 46520 146650
  3     7    6980211 hda7 11889 30475 338890 340740 12683 22158 279376 953380 0 509350 1294120

major:  主设备号。3 代表 hda。
minor:  次设备号。7 代表 No.7 分区。
#blocks: 设备总块数 (1024 bytes/block)。19535040*1024 => 20003880960(bytes) ~2G
name:  设备名称。如 hda7。

rio:    完成的读 I/O 设备总次数。指真正向 I/O 设备发起并完成的读操作数目,
  也就是那些放到 I/O 队列中的读请求。注意很多进程发起的读操作
  (read())很可能会和其他的操作进行 merge,不一定每个 read() 调用
  都引起一个 I/O 请求。
rmerge: 进行了 merge 的读操作数目。
rsect:  读扇区总数 (512 bytes/sector)

ruse:   从进入读队列到读操作完成的时间累积 (毫秒)。上面的例子显示从开机
       开始,读 hda7 操作共用了约340秒。

wio:  完成的写 I/O 设备总次数。
wmerge:  进行了 merge 的写操作数目。
wsect:  写扇区总数
wuse:  从进入写队列到写操作完成的时间累积 (毫秒)

running: 已进入 I/O 请求队列,等待进行设备操作的请求总数。上面的例子显
   示 hda7 上的请求队列长度为 0。

use:  扣除重叠等待时间的净等待时间 (毫秒)。一般比 (ruse+wuse) 要小。比
  如 5 个读请求同时等待了 1 毫秒,那么 ruse值为5ms, 而 use值为
  1ms。use 也可以理解为I/O队列处于不为空状态的总时间。hda7 的I/O
  队列非空时间为 509 秒,约合8分半钟。
 
aveq:  在队列中总的等待时间累积 (毫秒) (约等于ruse+wuse)

2. iostat 结果解析

# iostat  -x
Linux 2.4.21-9.30AX (localhost)         2004年07月14日

avg-cpu:  %user   %nice    %sys   %idle
          3.85    0.00    0.95   95.20

Device:    rrqm/s wrqm/s   r/s   w/s  rsec/s  wsec/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
/dev/hda     1.70   1.70  0.82  0.82   19.88   20.22     9.94    10.11    24.50    11.83   57.81 610.76  99.96
/dev/hda1    0.00   0.00  0.00  0.00    0.01    0.00     0.00     0.00    12.92     0.00   10.77  10.77   0.00
/dev/hda5    0.02   0.00  0.00  0.00    0.03    0.00     0.02     0.00     6.60     0.00    6.44   6.04   0.00
/dev/hda6    0.01   0.38  0.05  0.03    0.43    3.25     0.21     1.62    46.90     0.15  193.96  52.25   0.41
/dev/hda7    1.66   1.33  0.76  0.79   19.41   16.97     9.70     8.49    23.44     0.79   51.13  19.79   3.07

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:  每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。
wkB/s:  每秒写K字节数。是 wsect/s 的一半。
avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。即 delta(rsect+wsect)/delta(rio+wio)
avgqu-sz: 平均I/O队列长度。即 delta(aveq)/s/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系统已经满负荷,该磁盘
可能存在瓶颈。

svctm 一般要小于 await (因为同时等待的请求的等待时间被重复计算了),
svctm 的大小一般和磁盘性能有关,CPU/内存的负荷也会对其有影响,请求过多
也会间接导致 svctm 的增加。await 的大小一般取决于服务时间(svctm) 以及
I/O 队列的长度和 I/O 请求的发出模式。如果 svctm 比较接近 await,说明
I/O 几乎没有等待时间;如果 await 远大于 svctm,说明 I/O 队列太长,应用
得到的响应时间变慢,如果响应时间超过了用户可以容许的范围,这时可以考虑
更换更快的磁盘,调整内核 elevator 算法,优化应用,或者升级 CPU。

队列长度(avgqu-sz)也可作为衡量系统 I/O 负荷的指标,但由于 avgqu-sz 是
按照单位时间的平均值,所以不能反映瞬间的 I/O 洪水。

3. I/O 系统 vs. 超市排队

举一个例子,我们在超市排队 checkout 时,怎么决定该去哪个交款台呢? 首当
是看排的队人数,5个人总比20人要快吧? 除了数人头,我们也常常看看前面人
购买的东西多少,如果前面有个采购了一星期食品的大妈,那么可以考虑换个队
排了。还有就是收银员的速度了,如果碰上了连钱都点不清楚的新手,那就有的
等了。另外,时机也很重要,可能 5 分钟前还人满为患的收款台,现在已是人
去楼空,这时候交款可是很爽啊,当然,前提是那过去的 5 分钟里所做的事情
比排队要有意义 (不过我还没发现什么事情比排队还无聊的)。

I/O 系统也和超市排队有很多类似之处:

  r/s+w/s 类似于交款人的总数
  平均队列长度(avgqu-sz)类似于单位时间里平均排队人的个数
  平均服务时间(svctm)类似于收银员的收款速度
  平均等待时间(await)类似于平均每人的等待时间
  平均I/O数据(avgrq-sz)类似于平均每人所买的东西多少
  I/O 操作率 (%util)类似于收款台前有人排队的时间比例。
 
我们可以根据这些数据分析出 I/O 请求的模式,以及 I/O 的速度和响应时间。

4. 一个例子

# iostat -x 1
avg-cpu:  %user   %nice    %sys   %idle
         16.24    0.00    4.31   79.44
Device:    rrqm/s wrqm/s   r/s   w/s  rsec/s  wsec/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
/dev/cciss/c0d0
            0.00  44.90  1.02 27.55    8.16  579.59     4.08   289.80    20.57    22.35   78.21   5.00  14.29
/dev/cciss/c0d0p1
            0.00  44.90  1.02 27.55    8.16  579.59     4.08   289.80    20.57    22.35   78.21   5.00  14.29
/dev/cciss/c0d0p2
            0.00   0.00  0.00  0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

上面的 iostat 输出表明秒有 28.57 次设备 I/O 操作: delta(io)/s = r/s +
w/s = 1.02+27.55 = 28.57 (次/秒) 其中写操作占了主体 (w:r = 27:1)。

平均每次设备 I/O 操作只需要 5ms 就可以完成,但每个 I/O 请求却需要等上
78ms,为什么? 因为发出的 I/O 请求太多 (每秒钟约 29 个),假设这些请求是
同时发出的,那么平均等待时间可以这样计算:

  平均等待时间 = 单个 I/O 服务时间 * ( 1 + 2 + … + 请求总数-1) / 请求总数

应用到上面的例子: 平均等待时间 = 5ms * (1+2+…+28)/29 = 70ms,和
iostat 给出的 78ms 的平均等待时间很接近。这反过来表明 I/O 是同时发起的。

每秒发出的 I/O 请求很多 (约 29 个),平均队列却不长 (只有 2 个 左右),
这表明这 29 个请求的到来并不均匀,大部分时间 I/O 是空闲的。

一秒中有 14.29% 的时间 I/O 队列中是有请求的,也就是说,85.71% 的时间里
I/O 系统无事可做,所有 29 个 I/O 请求都在142毫秒之内处理掉了。

delta(ruse+wuse)/delta(io) = await = 78.21 => delta(ruse+wuse)/s =
78.21 * delta(io)/s = 78.21*28.57 = 2232.8,表明每秒内的I/O请求总共需
要等待2232.8ms。所以平均队列长度应为 2232.8ms/1000ms = 2.23,而 iostat
给出的平均队列长度 (avgqu-sz) 却为 22.35,为什么?! 因为 iostat 中有
bug,avgqu-sz 值应为 2.23,而不是 22.35。

分类: 只谈技术 标签: ,

linux下磁盘性能测试

2008年7月31日 没有评论

windows下面可以说测试磁盘性能的方法有很多,但是在linux其实系统本身就带了一个方便的测试工具hdparm

测试磁盘性能(不cache)

[root@localhost ~]# hdparm -t /dev/sda

/dev/sda:
 Timing buffered disk reads:   86 MB in  3.03 seconds =  28.37 MB/sec

测试磁盘性能(带cache)

[root@localhost ~]# hdparm -T /dev/sda

/dev/sda:
 Timing cached reads:   4228 MB in  2.00 seconds = 2115.84 MB/sec
[root@localhost ~]#
You have new mail in /var/spool/mail/root

分类: 只谈技术 标签:

[转载]Linux中文件查找技术大全(find命令)

2006年12月13日 没有评论

每一种操作系统都是由成千上万个不同种类的文件所组成的。其中有系统本身自带的文件,用户自己的文件,还有共享文件等等。我们有时候经常忘记某份文件放在硬盘中的哪个地方。在微软的WINDOWS操作系统中要查找一份文件是相当简单的事情,只要在桌面上点击“开始”-“搜索”中就能按照各种方式在本地硬盘上,局域网络,甚至在INTERNET上查找各种文件,文档。

可是使用Linux的用户就没有那么幸运了,在Linux上查找某个文件确实是一件比较麻烦的事情。毕竟在Linux中需要我们使用专用的“查找”命令来寻找在硬盘上的文件。Linux下的文件表达格式非常复杂,不象WINDOWS,DOS下都是统一的AAAAAAA.BBB格式那么方便查找,在WINDOWS中,只要知道要查找的文件的文件名或者后缀就非常容易查找到。Linux中查找文件的命令通常为“find”命令,“find”命令能帮助我们在使用,管理Linux的日常事务中方便的查找出我们需要的文件。对于Linux新手来说,“find”命令也是了解和学习Linux文件特点的方法。因为Linux发行版本繁多,版本升级很快,在Linux书籍上往往写明某个配置文件的所在位置,往往Linux新手按图索骥还是不能找到。比如说REDHAT Linux 7.O和REDHAT Linux 7.1中有些重要的配置文件所在的硬盘位置和文件目录就有了很大的改变,如果不学会使用“find”命令,那么在成千上万的Linux文件中要找到其中的一个配置文件是相当困难的,笔者在没有精通“find”命令之前就吃过这样的苦头。好,下面就详细为大家介绍强大的“find”命令的全部使用方法和用途。

通过文件名查找法:
这个方法说起来就和在WINDOWS下查找文件一样容易理解了。如果你把这个文件放在单个的文件夹里面,只要使用常见的“ls”命令就能方便的查找出来,那么使用“find”命令来查找它就不能给你留下深刻的印象,毕竟“find”命令的强大功能不止这个。如果知道了某个文件的文件名,而不知道这个文件放到哪个文件夹,甚至是层层套嵌的文件夹里。举例说明,假设你忘记了httpd.conf这个文件在系统的哪个目录下,甚至在系统的某个地方也不知道,则这是可以使用如下命令:
find / -name httpd.conf

这个命令语法看起来很容易就明白了,就是直接在find后面写上 -name,表明要求系统按照文件名查找,最后写上httpd.conf这个目标文件名即可。稍等一会系统会在计算机屏幕上显示出查找结果列表:
etc/httpd/conf/httpd.conf

这就是httpd.conf这个文件在Linux系统中的完整路径。查找成功。
如果输入以上查找命令后系统并没有显示出结果,那么不要以为系统没有执行find/ -name httpd.conf命令,而可能是你的系统中没有安装Apache服务器,这时只要你安装了Apache Web服务器,然后再使用find / -name httpd.conf就能找到这个配置文件了。

无错误查找技巧:
在Linux系统中“find”命令是大多数系统用户都可以使用的命令,并不是ROOT系统管理员的专利。但是普通用户使用“find”命令时也有可能遇到这样的问题,那就是Linux系统中系统管理员ROOT可以把某些文件目录设置成禁止访问模式。这样普通用户就没有权限用“find”命令来查询这些目录或者文件。当普通用户使用“find”命令来查询这些文件目录是,往往会出现”Permissiondenied.”(禁止访问)字样。系统将无法查询到你想要的文件。为了避免这样的错误,我们可是使用转移错误提示的方法尝试着查找文件,输入
find / -name access_log 2>/dev/null

这个方法是把查找错误提示转移到特定的目录中去。系统执行这个命令后,遇到错误的信息就直接输送到stderrstream 2 中,access_log 2就是表明系统将把错误信息输送到stderrstream 2中,/dev/null是一个特殊的文件,表明空的或者错误的信息,这样查询到的错误信息将被转移了,不会再显示了。

在Linux系统查找文件也会遇到这样一个实际问题。如果我们在整个硬盘,这个系统中查找某个文件就要花费相当长的一段时间,特别是大型Linux系统和容量较大的硬盘,文件放在套嵌很深的目录中的时候。如果我们知道了这个文件存放在某个大的目录中,那么只要在这个目录中往下找就能节省很多时间了。使用find /etc -name httpd.conf 就可以解决这个问题。上面的命令就是表示在etc目录中查询httpd.conf这个文件。这里再说明一下“/ ”这个函数符号的含义,如果输入 “find/ ”就是表示要求Linux系统在整个ROOT目录下查找文件,也就是在整个硬盘上查找文件,而“find/etc”就是只在 etc目录下查找文件。因为“find/etc”表示只在etc目录下查找文件,所以查找的速度就相应要快很多了。

根据部分文件名查找方法:
这个方法和在WINDOWS中查找已知的文件名方法是一样的。不过在Linux中根据部分文件名查找文件的方法要比在WINDOWS中的同类查找方法要强大得多。例如我们知道某个文件包含有srm这3个字母,那么要找到系统中所有包含有这3个字母的文件是可以实现的,输入:
find /etc -name ‘*srm*’

这个命令表明了Linux系统将在/etc整个目录中查找所有的包含有srm这3个字母的文件,比如 absrmyz, tibc.srm等等符合条件的文件都能显示出来。如果你还知道这个文件是由srm 这3个字母打头的,那么我们还可以省略最前面的星号,命令如下:
find/etc -name ‘srm*’

这是只有像srmyz 这样的文件才被查找出来,象absrmyz或者 absrm这样的文件都不符合要求,不被显示,这样查找文件的效率和可靠性就大大增强了。

根据文件的特征查询方法:
如果只知道某个文件的大小,修改日期等特征也可以使用“find”命令查找出来,这和WINDOWS系统中的”搜索”功能是基本相同的。在微软的”搜索”中WINDOWS中的”搜索助理”使得搜索文件和文件夹、打印机、用户以及网络中的其他计算机更加容易。它甚至使在Internet 上搜索更加容易。”搜索助理”还包括一个索引服务,该服务维护了计算机中所有文件的索引,使得搜索速度更快。使用”搜索助理”时,用户可以指定多个搜索标准。例如,用户可以按名称、类型及大小搜索文件和文件夹。用户甚至可以搜索包含特定文本的文件。如果用户正使用 Active Directory,这时还可以搜索带有特定名称或位置的打印机。

例如我们知道一个Linux文件大小为1,500 bytes,那么我们可是使用如下命令来查询find / -size 1500c,字符 c 表明这个要查找的文件的大小是以bytes为单位。如果我们连这个文件的具体大小都不知道,那么在Linux中还可以进行模糊查找方式来解决。例如我们输入find/ -size +10000000c 这个命令,则标明我们指定系统在根目录中查找出大于10000000字节的文件并显示出来。命令中的“+”是表示要求系统只列出大于指定大小的文件,而使用“-”则表示要求系统列出小于指定大小的文件。下面的列表就是在Linux使用不同“ find”命令后系统所要作出的查找动作,从中我们很容易看出在Linux中使用“find”命令的方式是很多的,“ find”命令查找文件只要灵活应用,丝毫不必在WINDOWS中查找能力差。

find / -amin -10 # 查找在系统中最后10分钟访问的文件
find / -atime -2 # 查找在系统中最后48小时访问的文件
find / -empty # 查找在系统中为空的文件或者文件夹
find / -group cat # 查找在系统中属于 groupcat的文件
find / -mmin -5 # 查找在系统中最后5分钟里修改过的文件
find / -mtime -1 #查找在系统中最后24小时里修改过的文件
find / -nouser #查找在系统中属于作废用户的文件
find / -user fred #查找在系统中属于FRED这个用户的文件

下面的列表就是对find命令所可以指定文件的特征进行查找的部分条件。在这里并没有列举所有的查找条件,参考有关Linux有关书籍可以知道所有find命令的查找函数。
-amin n
查找系统中最后N分钟访问的文件
-atime n
查找系统中最后n*24小时访问的文件
-cmin n
查找系统中最后N分钟被改变状态的文件
-ctime n
查找系统中最后n*24小时被改变状态的文件
-empty
查找系统中空白的文件,或空白的文件目录,或目录中没有子目录的文件夹
-false
查找系统中总是错误的文件
-fstype type
查找系统中存在于指定文件系统的文件,例如:ext2 .
-gid n
查找系统中文件数字组 ID 为 n的文件
-group gname
查找系统中文件属于gnam文件组,并且指定组和ID的文件

Find命令的控制选项说明:
Find命令也提供给用户一些特有的选项来控制查找操作。下表就是我们总结出的最基本,最常用的find命令的控制选项及其用法。
选项
用途描述
-daystart
.测试系统从今天开始24小时以内的文件,用法类似-amin
-depth
使用深度级别的查找过程方式,在某层指定目录中优先查找文件内容
-follow
遵循通配符链接方式查找; 另外,也可忽略通配符链接方式查询
-help
显示命令摘要
-maxdepth levels
在某个层次的目录中按照递减方法查找
-mount
不在文件系统目录中查找, 用法类似 -xdev.
-noleaf
禁止在非UNUX文件系统,MS-DOS系统,CD-ROM文件系统中进行最优化查找
-version
打印版本数字

使用-follow选项后,find命令则遵循通配符链接方式进行查找,除非你指定这个选项,否则一般情况下find命令将忽略通配符链接方式进行文件查找。

-maxdepth选项的作用就是限制find命令在目录中按照递减方式查找文件的时候搜索文件超过某个级别或者搜索过多的目录,这样导致查找速度变慢,查找花费的时间过多。例如,我们要在当前(.)目录技巧子目录中查找一个名叫fred的文件,我们可以使用如下命令
find . -maxdepth 2 -name fred

假如这个fred文件在./sub1/fred目录中,那么这个命令就会直接定位这个文件,查找很容易成功。假如,这个文件在./sub1/sub2/fred目录中,那么这个命令就无法查找到。因为前面已经给find命令在目录中最大的查询目录级别为2,只能查找2层目录下的文件。这样做的目的就是为了让find命令更加精确的定位文件,如果你已经知道了某个文件大概所在的文件目录级数,那么加入-maxdepth n 就很快的能在指定目录中查找成功。

使用混合查找方式查找文件
find命令可以使用混合查找的方法,例如我们想在/tmp目录中查找大于100000000字节并且在48小时内修改的某个文件,我们可以使用-and 来把两个查找选项链接起来组合成一个混合的查找方式。
find /tmp -size +10000000c -and -mtime +2

学习过计算机语言的朋友都知道,在计算机语言里,使用and ,or 分别表示“与”和“或”的关系。在Linux系统的查找命令中一样通用。
还有这样的例子,
find / -user fred -or -user george

我们可以解释为在/tmp目录中查找属于fred或者george这两个用户的文件。
在find命令中还可以使用“非”的关系来查找文件,如果我们要在/tmp目录中查找所有不属于panda的文件,使用一个简单的
find /tmp ! -user panda
命令就可以解决了。很简单。

查找并显示文件的方法
查找到某个文件是我们的目的,我们更想知道查找到的文件的详细信息和属性,如果我们采取现查找文件,在使用LS命令来查看文件信息是相当繁琐的,现在我们也可以把这两个命令结合起来使用。
find / -name “httpd.conf” -ls

系统查找到httpd.conf文件后立即在屏幕上显示httpd.conf文件信息。
12063 34 -rw-r–r– 1 root root 33545 Dec 30 15:36 /etc/httpd/conf/httpd.conf

下面的表格就是一些常用的查找文件并显示文件信息的参数和使用方法
选项
用途描述
-exec command;
查找并执行命令
-fprint file
打印文件完整文件名
-fprint0 file
打印文件完整文件名包括空的文件
-fprintf file format
打印文件格式
-ok command;
给用户命令执行操作,根据用户的Y 确认输入执行
-printf format
打印文件格式
-ls
打印同种文件格式的文件.

分类: 只谈技术 标签: ,

[转载]LAMP 架构服务器性能优化建议

2006年6月8日 没有评论

文摘出处:http://www.paulgao.com.cn/index.php?catid=5&blogid=1

LAMP 架构服务器性能优化建议
(03/11/2004,R1版)

  出处:http://www.paulgao.com.cn,欢迎转载。
  关键词:LINUX、APACHE、PHP、MYSQL、服务器、性能优化、配置优化。

  维护“手机之家”(http://www.imobile.com.cn)的服务器有快两年了,也有些经验心得,写在这里给大家分享。

  服务器配置如下:redhat linux 9.0、apache 1.3.29、php 4.3.4、mysql 3.23.58,以下建议均在以上平台上跑的很好,当然也跟你的应用有关系,具体实施要根据实际效果来进行。

  1、众所周知的方法就是使用 Zend Optimizer(简称 ZO,最新版本为 2.5.1) 或者 Zend Performance Suite(简称 ZPS,其中包含 ZO,最新版本为 3.6.0)对 PHP 进行加速。相关软件可到张微波的主页来下载哦,地址为:http://www.5ilinux.com/blog/archives/000093.html

  2、apache配置优化(httpd.conf)
1)修改“Timeout”的值为 30-60,如果你得程序没有执行时间需要很长的话,可以修改到 10-15;
2)修改“KeepAlive”的值为“Off”,这个很有效果,也很有争议,我自己的看法是很有效果,而且并没有影响速度,大家可以自行试验;
3)修改“MaxRequestsPerChild”的值为“2048”,这个还在试验中,一是因为怕有内存泄漏,二是因为 apache 进程会因为随着服务时间的延长,会变得越来越胖(我这里的实际情况是某些 apache 进程会狂吃内存到18MB,晕啊:),不过这设置有没有效果,还在试验中;
4)在不使用 .htaccess 的情况下,将其“”部分设置为“None”方式,如果你使用 PHPMYADMIN 进行管理的话,可以使用 PHPMYADMIN 的 COOKIE 权限控制方式。

  3、卸载不必要的模块,不管是静态编译还是 DSO 模式,以便节省内存占用。具体模块可以参照 apache 的手册,这里就不多说了。PHP 也是同样,我基本上已经把不用的模块都卸载了:)

  4、使用 mod_gzip 进行加速,很简单,就不多说了。

  5、如果你的服务器还是负载很高的话,更极端的方式就是在 httpd.conf 里面将日志停掉了,不过一般要保留 errorlog 才好,以便排错,而且要记得,不是把“CustomLog”注释掉就行了,而要使用“CustomLog /dev/null common”这样的方式才好。

  6、如果你的 PHP 程序使用 Session 对话的话,可以在 php.ini 里面将“session.save_path”设置为“session.save_path = /dev/shm”,因为 /dev/shm 是 linux 系统独有的 TMPFS 文件系统,是以内存为主要存储方式的文件系统,比 RAMDISK 要好,因为可以使用 DISKSWAP 作为补充,而且是系统自带,不需要另行配置,想想吧,从磁盘IO操作到内存操作,速度会快多少?:)你也可以把你所需要的临时文件都写在 /dev/shm 下,只是别忘了,重启就没有啦,我是只存放目标文件的,呵呵。额外的说明资料请看“使用虚拟内存(virtual memory,VM)文件系统和绑定安装”(http://www-900.ibm.com/developerWorks/cn/linux/filesystem/l-fs3/index.shtml)。

  7、MYSQL 的优化(/etc/my.cnf)
1)确认在“[mysqld]”部分加入了“skip-innodb”和“skip-bdb”参数;
2)确认在“[mysqld]”部分加入了“skip-name-resolve”和“skip-locking”参数;
3)如果不需要的话,可以将二进制日志(binlog)停掉,方法是将“log-bin”注释掉;
4)在内存允许的情况下,对一些参数进行重新配置,目标在于将大部分操作集中于内存中,尽量不进行磁盘操作,对于我的 MYSQL 服务器我是如下修改的,基于 2G 内存情况:

[mysqld]
set-variable = key_buffer=512M
set-variable = max_allowed_packet=4M
set-variable = table_cache=1024
set-variable = thread_cache=64
set-variable = join_buffer_size=32M
set-variable = sort_buffer=32M
set-variable = record_buffer=32M
set-variable = max_connections=512
set-variable = wait_timeout=120
set-variable = interactive_timeout=120
set-variable = max_connect_errors=30000
set-variable = long_query_time=1
set-variable = max_heap_table_size=256M
set-variable = tmp_table_size=128M
set-variable = thread_concurrency=8
set-variable = myisam_sort_buffer_size=128M

你可以根据“show status”命令返回的状态进行微调。我主要注意以下变量的数值,越小越好,最好为零:)
Created_tmp_disk_tables
Created_tmp_tables
Created_tmp_files
Slow_queries

  8、在启动脚本中使用“–log-slow-queries=/home/logs/mysql_slow.log”参数,以便进行 SQL 语句的优化工作,这个其实是很很重要的工作。记得一定要在 my.cnf 中设置“set-variable = long_query_time=1”才行。

  9、另外可以使用 4.0.xx 版本的 MYSQL,4.0.xx 版本除了一些性能提升以外,还有 QueryCache 方法,就是在 SQL 语句查询结果没有变动之前,将其结果进行缓存,下次再进行同样的 SQL 语句查询就可以直接反回结果,当然也是以牺牲内存为前提:)

  10、额外的,对于 LINUX EXT3 文件系统还有一个小技巧可用,就是在修改 /etc/fstab 中的参数,比如“/dev/sdb2 /home ext3 defaults 1 2”改为“/dev/sdb2 /home ext3 noatime 1 2”,“noatime”的意思就是不修改 accesstime,对于磁盘文件读写频繁的服务器也应该可以降低一些效果。不过最好不要远程操作,不然因为修改失误,服务器不能启动了,可别怪我:)

  好了,基本上我用过的方法已经说过一遍了,有些方法是取自于一些很好的文章,由于未作保留,所以无法写出出处,只能泛泛的表示感谢了。其中有些方法也适用于 Windows 平台,大家可以根据自己的服务器、应用情况去进行应用,大家也可一说说自己的办法,比如改用 ZEUS 来做 webserver,我也在找更多的办法来提升服务器性能,比如基于 LINUX KERNEL v2.4 以上内核的一些性能优化方法,从 network 到 swap(因为内核升级,所以一些老版本内核的方法已经不能再使用了:)。我也会进一步更新这篇文章,让大家能够更好的进行服务器的性能提升工作~

  另外欢迎来访问国内数一数二的手机网站,手机之家,地址见下,呵呵~

高春辉
mailto:paulgao@yeah.net
手机之家网站(http://www.imobile.com.cn)

分类: 只谈技术 标签: , , ,

Linux下常用配置文件及常用命令介绍

2005年12月6日 没有评论

/etc/sysconfig/network 包括主机基本网络信息,用于系统启动

/etc/sysconfig/network-script/ 此目录下是系统启动最初始化网络的信息

/etc/sysconfig/network-script/ifcfg-eth0 网络配置信息

/etc/xinetd.conf 定义了由超级进程XINETD启动的网络服务

/etc/protocols 设定了主机使用的协议以及各个协议的协议号

/etc/services 设定了主机的不同端口的网络服务

// 网络配置工具

# redhat-config-network

/* 使用ifconfig命令配置并查看网络接口情况 */

//配置eth0的IP,同时激活设备

# ifconfig eth0 192.168.168.119 netmask 255.255.255.0 up

//配置eth0别名设备 eth0:1 的IP,并添加路由

# ifconfig eth0:1 192.168.168.110

# route add –host 192.168.168.110 dev eth0:1

//激活(禁用)设备

# ifconfig eth0:1 up(down)

//查看所有(指定)网络接口配置

# ifconfig (eth0)

/* 使用route 命令配置路由表 */

//添加到主机路由

# route add –host 192.168.168.110 dev eth0:1

# route add –host 192.168.168.119 gw 192.168.168.1

//添加到网络的路由

# route add –net IP netmask MASK eth0

# route add –net IP netmask MASK gw IP

# route add –net IP/24 eth1

//添加默认网关

# route add default gw IP

//删除路由

# route del –host 192.168.168.110 dev eth0:1

/* 常用命令 */

# traceroute www.pconline.com.cn

# ping www.pconline.com.cn

//显示网络接口状态信息

# netstat –I

//显示所有监控的服务器的Socket和正在使用Socket的程序信息

# netstat –lpe

//显示内核路由表信息

# netstat –r

# netstat –nr

//显示TCP/UDP传输协议的连接状态

# netstat –t

# netstat –u

//更改主机名

# hostname myhost

//查看ARP缓存

# arp

//添加

# arp –s IP MAC

//删除

# arp –d IP

/* 运行级别与网络服务 */

//查看当前运行级别

# runlevel

//运行级别的切换

# init

# telinit

分类: 只谈技术 标签: