性能相关


22
八 11

Dell服务器RAID卡的简单调整

Dell的服务器因为性价比高,是中小企业构建IT设施采用的主流品牌。

下面简单说一下Dell服务器的RAID卡的性能调整。个人在这方面的经验并不十分丰富,有可能理解有误。

问题的焦点,是因为RAID卡的缓存模块的(BBU)电池,具体的原理,这里并不深研,有兴趣的同学,可跟据下面提供的URL自行研究。这块电池是可充电池,我的理解是这样的:这块电池的作用,是用来“保护数据”的,即当服务器突然掉电时,RAID卡的电池储存的电能足以驱动RAID卡和磁盘,某些固化在RAID卡中的程序会将RAID卡“缓存”(注意这里提到的缓存)的数据,写到磁盘上,从而降低、减少数据丢失的风险。

可能是可充电池的特性,这块可充电电池,在不使用时,也会有微弱的放电现象,当它的电量放电到低到一定程度时,RAID卡程序,会对电池进行一次“放电”,将剩余的电量放掉,然后再进行一次“充电”。

这其实是一种对“电池”保护机制,以及对RAID设施可用性提供保障的机制。

问题就出在这个放电、充电的过程。

默认情况下,当RAID卡的电池的电量低于某阈值时,RAID卡固化程序认为此时的电池是不可用的,为了保证数据的安全,会禁用RAID的“缓存”,这种默认的机制本来是合情合理的,没有什么可“质疑”的。问题是,当RAID的缓存被禁用之后,RAID的I/O能力会有所下降(这简直是一定的)。对于高I/O的应用来说,这种下降,有可能是致命的,可能会导致系统I/O阻塞,构架不良的系统,有可能会被这个“故障点”(正在充放电的设备上的应用)拖死。

有两种方法解决这个问题:

1. 检查电池的状态,对电池的充放电进行撑握,也可有计划地安排手动充放电。

此时I/O性能依然是会下降的,可以安排在系统负载低的时候进行手动充放电,从而避免充放电在未知的时间里自动进行充放电,影响业务。

2. 为了保障性能,粗暴地改变RAID卡策略,使在充放电时,不禁用RAID卡缓存。

些时I/O的性能不会下降,但是,假如在此时服务器掉电,RAID卡缓存中的数据会来不及写进磁盘,从而造成数据的丢失。

使用1比较稳妥,但是比较耗时、耗力。使用2比较简单,对于不是非常重要的数据、某者还有别的冗余方案的应用,可以使用。

Dell的服务器,大多使用的都是LSI的MegaRAID卡,查看系统使用的什么RAID卡,可以使用lspci命令,这个假如包含在pciutils包中。

常见的MegaRAID卡:

  • 02:0e.0 RAID bus controller [0104]: Dell PowerEdge Expandable RAID controller 4 [1028:0013] (rev 06)
  • 04:03.0 RAID bus controller [0104]: Dell PowerEdge Expandable RAID controller 4/Di [1028:000f] (rev 02)
  • 02:04.0 RAID bus controller [0104]: American Megatrends Inc. MegaRAID [101e:1960] (rev 02)
  • 02:03.0 RAID bus controller [0104]: LSI Logic / Symbios Logic MegaRAID [1000:1960] (rev 01)

也可以通过lsmod | grep megaraid 来检查系统使用的是不是MegaRAID卡。

MegaRAID卡,可以通过官方提供的工具MegaCli来进行控制,对缓存的控制策略调整就用这个工具来进行操作。

MegaCli的当前版本可从这里下载

假如你使用的是RHEL或者CentOS,可使用我的repo安装,步聚如下:

1) wget -P /etc/yum.repo.d http://www.bsdmap.com/bsdmap.repo

2) yum install megacli

默认安装在/opt/MegaRAID/MegaCli/目录下,32位系统为MegaCli,64位系统为MegaCli64,以64位系统为例:

1. 查看当前“策略”
/opt/MegaRAID/MegaCli/MegaCli64 -ldinfo -lall -a0

Adapter 0 — Virtual Drive Information:
Virtual Disk: 0 (Target Id: 0)
Name:Virtual Disk 0
RAID Level: Primary-0, Secondary-0, RAID Level Qualifier-0
Size:953344MB
State: Optimal
Stripe Size: 64kB
Number Of Drives:1
Span Depth:1
Default Cache Policy: WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU
Current Cache Policy: WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU
Access Policy: Read/Write
Disk Cache Policy: Disk’s Default
Virtual Disk: 1 (Target Id: 1)
Name:
RAID Level: Primary-5, Secondary-0, RAID Level Qualifier-3
Size:3813376MB
State: Optimal
Stripe Size: 64kB
Number Of Drives:5
Span Depth:1
Default Cache Policy: WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU
Current Cache Policy: WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU
Access Policy: Read/Write
Disk Cache Policy: Disk’s Default

Exit Code: 0×00

2. 调整

/opt/MegaRAID/MegaCli/MegaCli64 -LDSetProp CachedBadBBU -lall -a0

再查看
/opt/MegaRAID/MegaCli/MegaCli64 -ldinfo -lall -a0

Adapter 0 — Virtual Drive Information:
Virtual Disk: 0 (Target Id: 0)
Name:Virtual Disk 0
RAID Level: Primary-0, Secondary-0, RAID Level Qualifier-0
Size:953344MB
State: Optimal
Stripe Size: 64kB
Number Of Drives:1
Span Depth:1
Default Cache Policy: WriteBack, ReadAheadNone, Direct, Write Cache OK if Bad BBU
Current Cache Policy: WriteBack, ReadAheadNone, Direct, Write Cache OK if Bad BBU
Access Policy: Read/Write
Disk Cache Policy: Disk’s Default
Virtual Disk: 1 (Target Id: 1)
Name:
RAID Level: Primary-5, Secondary-0, RAID Level Qualifier-3
Size:3813376MB
State: Optimal
Stripe Size: 64kB
Number Of Drives:5
Span Depth:1
Default Cache Policy: WriteBack, ReadAheadNone, Direct, Write Cache OK if Bad BBU
Current Cache Policy: WriteBack, ReadAheadNone, Direct, Write Cache OK if Bad BBU
Access Policy: Read/Write
Disk Cache Policy: Disk’s Default

Exit Code: 0×00

 

embedded_mr_sw_ug.pdf

http://linux.dell.com/repo/hardware/

http://tools.rapidsoft.de/perc/

http://linux.dell.com/

http://linux.dell.com/wiki/index.php/Repository/firmware

 

http://hwraid.le-vert.net/wiki/LSIMegaRAID

http://hwraid.le-vert.net/wiki/LSIMegaRAIDSAS

 


24
二 10

使用expires模块降低apache负载

使用expires模块声明静态文件过期时间-减少客户端不必要的请求

<Location />
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/* “access plus 1 month”
ExpiresByType text/css “access plus 1 month”
ExpiresByType text/javascript   “access plus 1 month”
ExpiresByType application/x-javascript “access plus 1 month”
</IfModule>
</Location>
另一种方式:
<FilesMatch “\.(css|js|jpg|gif|png)$”>
<IfModule mod_expires.c>
ExpiresActive  On
ExpiresDefault A2592000
</IfModule>
</FilesMatch>

12
九 09

计算机资源-时间与空间关系

原作者:曹刚

计算机由cpu、内存、硬盘三个重要硬件构成,cpu是计算资源,属于时间资源,内存和外部存储(硬盘等)属于空间资源。在计算机中,我们知道速度最快的是cpu,cpu由控制单元、运算单元、时钟组成。cpu寄存器阵列实际上相当于处理器内部存储器,寄存器容量非常小,仅用于临时存储计算数据所用,它的存储速度最快。
我们大家知道,cpu速度相对磁盘来说,相差非常大,因此cpu是不能直接从硬盘读取数据的,必须先把数据从磁盘读取到内存之后,cpu才能对内存中的数据进行操作,内存的速度比磁盘快很多,但是要比cpu慢。我们可以看见,速度从慢到快的顺序来排列为:磁盘-内存-cpu。
从目前的情况来看,每隔一段时间,cpu的运算速度便会大幅度提升,但是内存和磁盘(特别是磁盘)的速度一直没有多大提升。因此在我们的系统中,经常发现的系统瓶颈出现在磁盘上。如果磁盘、内存速度和cpu速度一样快,那么我们工作中很多问题就很简单了,但是事实却是相反,因此我们有必要深入了解时间与空间的关系,在这个基础上进行架构设计、软件设计以及维护,能够起到事半功倍的效果。


28
九 08

禁止对数据分区的locate数据库更新

我们的/srv/分区相当的大,图片服务器的就更大了。

所以是不能允许对这个分区的文件进行(locate)索引的,即使系统使用的renice +19的方式运行,也是仍然是对系统资源的浪费。一来浪费CPU资源,二来浪费硬盘I/O,三,会使updatedb的数据库巨大,规划不当的话会使/var分区满掉(或者/分区满掉,假如var不是单独分区的话)。

使用cfengine更新了所有系统的配置文件,排除了对/srv分区的索引。

#/etc/updatedb.conf
PRUNEFS = “auto afs iso9660 sfs udf”
PRUNEPATHS = “/afs /media /net /sfs /tmp /udev /var/spool/cups /var/spool/squid /var/tmp /srv /mnt”


24
六 08

服务器网页缓存的深入分析

转自:http://www.yuanma.org/data/2007/0909/article_2851.htm

Expires、Cache-Control、Last-Modified、ETag是RFC
2616(HTTP/1.1)协议中和网页缓存相关的几个字段。前两个用来控制缓存的失效日期,后两个用来验证网页的有效性。要注意的是,
HTTP/1.0有一个功能比较弱的缓存控制机制:Pragma,使用HTTP/1.0的缓存将忽略Expires和Cache-Control头。我们
这里以Apache2.0服务器为例,只讨论HTTP/1.1协议。

Expires
Expires字段声明了一个网页或URL地址不再被浏览器缓存的时间,一旦超过了这个时间,浏览器都应该联系原始服务器。RFC告诉我们:“由于推断的失效时间也许会降低语义透明度,应该被谨慎使用,同时我们鼓励原始服务器尽可能提供确切的失效时间。”
对于一般的纯静态页面,如html、gif、jpg、css、js,默认安装的Apache服务器,不会在响应头添加这个字段。Firefox浏览器接受
到相应后,如果发现没有Expires字段,浏览器根据文件的类型和“Last-Modified”字段来推断出一个合适的失效时间,并存储在客户端。推
测出的时间一般是接受到响应时间后的三天左右。
Apache的expires_module模块可以在Http响应头部自动加上Expires字段。在Apache的httpd.conf文件中进行如下配置:
#启用expires_module模块
LoadModule expires_module modules/mod_expires.so
# 启用有效期控制
ExpiresActive On
# GIF有效期为1个月
ExpiresByType image/gif A2592000
# HTML文档的有效期是最后修改时刻后的一星期
ExpiresByType text/html M604800
#以下的含义类似
ExpiresByType text/css “now plus 2 month”
ExpiresByType text/js “now plus 2 day”
ExpiresByType image/jpeg “access plus 2 month”
ExpiresByType image/bmp “access plus 2 month”
ExpiresByType image/x-icon “access plus 2 month”
ExpiresByType image/png “access plus 2 month”
对于动态页面,如果在页面内部没有通过函数强制加上Expires,例如header(”Expires: ” . gmdate(”D,
d M Y H:i:s”) . ” GMT”),Apache服务器会把Wed, 11 Jan 1984 05:00:00
GMT作为Expires字段内容,返回给浏览器。即认为动态页面总是失效的。而浏览器仍然会保存已经失效的动态页面。
可以发现Firefox浏览器总是缓存所有页面,不管失效、不失效还是没有声明失效时间。即使缓存中声明了一个网页的实效日期是
1970-01- 01
08:00:00,浏览器仍然会发送该文件在缓存中的Last-Modified和ETag字段。如果在服务器端验证通过,返回304状态,浏览器就还会
使用此缓存。
Cache-Control
Cache-Control字段中可以声明多些元素,例如no-cache, must-revalidate,
max-age=0等。这些元素用来指明页面被缓存最大时限,如何被缓存的,如何被转换到另一个不同的媒介,以及如何被存放在持久媒介中的。但是任何一个
Cache-Control指令都不能保证隐私性或者数据的安全性。“private”和“no-store”指令可以为隐私性和安全性方面提供一些帮
助,但是他们并不能用于替代身
份验证和加密。
Apache的mod_cern_meta模块允许文件级Http响应头部的控制,同时它也可以配置Cache-Control头(或任何其他头)。响应
头文件是放在原始目录的子目录中,根据原始文件名所命名的一个文件。具体用法请参阅Apache的官方网站。其中Cache-Control :
max-age表示失效日期。如果没有启动mod_cern_meta模块,Apache服务器会把Expires字段中的日期换算成以秒为单位的一个
delta值,赋值给max-age。如果启动mod_cern_meta模块,并且配置了max-age值,Apache会将这个覆盖Expires字
段。同时,max-age隐含了Canche-Control: public。这样浏览器接受到的Cache-Control :
max-age和Expires值就是一致的。
如果失效日期Cache-Control : max-ag=0或者是负值,浏览器会在对应的缓存中把Expires设置为1970-01-01 08:00:00。
Last-Modified
Last-Modified和ETag是条件请求(Conditional
Request)相关的两个字段。如果一个缓存收到了针对一个页面的请求,它发送一个验证请求询问服务器页面是否已经更改,在HTTP头里面带上”
ETag”和”If Modify Since”头。服务器根据这些信息判断是否有更新信息,如果没有,就返回HTTP
304(NotModify);如果有更新,返回HTTP 200和更新的页面内容,并且携带新的”ETag”和”LastModified”。
使用这个机制,能够避免重复发送文件给浏览器,不过仍然会产生一个HTTP请求。
一般纯静态页面本身都会有Last-Modified信息,Apache服务器会读取页面文件中的Last-Modified信息,并添加到http响应头部。
对于动态页面,如果在页面内部没有通过函数强制加上Last-Modified,例如header(”Last-Modified:
” . gmdate(”D, d M Y H:i:s”) . ”
GMT”),Apache服务器会把当前时间作为Last-Modified,返回给浏览器。
无论是纯静态页面还是动态页面,Firefox浏览器巧妙地按照接受到服务器响应的时间设置缓存页面的Last-Modified,而不是按照http响应头部中的Last-Modified字段。
ETag
既然有了Last-Modified,为什么还要用ETag字段呢?因为如果在一秒钟之内对一个文件进行两次更改,Last-Modified就会不正确。因此,HTTP/1.1利用Entity Tag头提供了更加严格的验证。
Apache服务器默认情况下,会对所有的静态、动态文件的响应头添加ETag字段。在Apache的httpd.conf文件中可以通过FileETag指令配置该选项。
FileETag指令配置了当文档是基于一个文件时用以创建 Etag(entity tag)响应头的文件的属性。在Apache
1.3.22及以前,ETag的值是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后得到的。如果一个目录的
配置包含了‘FileETag INode MTime Size’而其一个子目录包含了‘FileETag
-INode’那么这个子目录的设置(并会被其下任何没有进行覆盖的子目录继承)将等价于‘FileETag MTime Size’。
在多台负载平衡的服务器环境下,同一个文件会有不同的etag或者文件修改日期,浏览器每次都会重新下载。设置‘FileETag None’可以使响应头不再包含ETag字段。
三种典型web服务器Header设置内容过期方法
一、Internet 信息服务 (IIS)的内容过期设置
如果IIS 网站中有时间敏感信息,可以配置设置来保证过期信息不被代理服务器或 Web 浏览器缓存。可以配置网站内容,使之在任
何的时间自动过期。当启用内容过期时,Web 浏览器将比较当前日期和截止日期,以便决定是显示缓存页还是从服务器请求更新的页
。Microsoft ASP.NET 这样的服务器端技术可用于动态更改提供的内容。通常,时间敏感信息只限于单个文件、目录或网站;不过,您也可以为某台计算机上的所有网站设置内容过期。
必须是本地计算机上 Administrators 组的成员或者必须被委派了相应的权限,才能执行下列步骤。作为安全性的最佳操作,请使用不属于 Administrators 组的帐户登录计算机,然后使用运行方式命令以管理员身份运行 IIS管理器
在命令提示符下,键入 runas /user:administrative_accountname “mmc %systemroot%\system32\inetsrv\iis.msc”。
设置网站内容的过期时间
1. 在 IIS 管理器中,展开本地计算机;右键单击要设置内容过期的网站、虚拟目录或文件,然后单击“属性”。
2. 单击“HTTP 头”选项卡。
3. 选中“启用内容过期”复选框。
4. 单击“立即过期”、“此时间段后过期”或“过期时间”,然后在对应的框中输入所需的过期信息。
5. 单击“确定”。
二、APACHE服务的内容过期设置
Apache配置摘录及解释
i. 过期相关设置
LoadModule headers_module modules/mod_headers.so
#Load 修改header的模块。
LoadModule expires_module modules/mod_expires.so
#Load 设定过期header的模块。
Header append Via: CCN-BJ-4-502
#增加一个Via header,值配置成设备的hostname。
KeepAliveTimeout 60
#设置连接的保持时间为60秒。
ExpiresActive On
#启用过期header功能。
ExpiresDefault A604800
#缺省过期时间为“访问后的604800秒”
<Directory /data/download>
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
ExpiresByType text/html A300
#text/html类型文件的过期设置为“访问后的300秒”
ExpiresByType text/css A259200
#text/css类型文件的过期设置为“访问后的259200秒”
ExpiresByType application/x-javascript A300
# application/x-javascript类型文件的过期设置为“访问后的300秒”
ExpiresByType image/gif A2592000
#image/gif类型文件的过期设置为“访问后的2592000秒”
ExpiresByType application/x-shockwave-flash A2592000
# application/x-shockwave-flash类型文件的过期设置为“访问后的2592000秒”
</Directory>
上述配置文件中load的两个模块:mod_headers.so 和mod_expires.so 可以让Apache具有对header的一些定制功能。
ExpiresByType: 表示按照文件类型-MIME-TYPE设定过期策略;
A300: 表示在Access后300秒后过期;
ExpiresByType text/css A2592000: 表示Mime type是text/css的文件,在Access后2592000秒过期。
ExpiresDefault A604800: 表示除了单独制定的文件类型等过期策略外的其他内容,按照这个缺省的策略设定:访问后604800秒过期。
上面的方法可以实现根据web发布的不同文件类型,针对不同的发布目录进行过期策略设置。在按照如上方法设置后,Apache会自动的产生两个相关的http header,举例如下:
HTTP/1.1 200 OK
Date: Tue, 27 Mar 2007 17:44:21 GMT
Server: Apache/2.0.54 (Unix)
Last-Modified: Thu, 25 Jan 2007 07:45:45 GMT
ETag: “72df3a-93-99499c40”
Accept-Ranges: bytes
Content-Length: 147
Cache-Control: max-age=2592000
Expires: Thu, 26 Apr 2007 17:44:21 GMT
Via: CCN-BJ-4-575
Keep-Alive: timeout=60, max=100
Connection: Keep-Alive
Content-Type: image/gif
Length: 147 [image/gif]
其中:Date + Max-age = Expires.
Max-age是个时间长度,对应web
server上面设置的过期时间;Expires是根据max-age算出来的过期时间点,两者是一致的,不同cache在判断内容是否过期时会严格比较
系统时间和上述过期时间,或者比较age(在cache中存住的时间长度)和max-age的值。
三、lighttpd
lighttpd默认是没有开启expire模块的,需要我们在使用是手工开启这个模块支持。把mod_expire前面的“#”号去掉。
# vi /usr/local/lighttpd/etc/lighttpd.conf
“mod_expire”,
设定过期时间
* 设定指定url的过期时间:
expire.url = (
“/images/” => “access 3 hours”,
“/admin/” => “access 3 hours”,
“/area/” => “access 3 hours”,
“/calendar/” => “access 3 hours”,
“/common/” => “access 3 hours”,
“/front/” => “access 3 hours”,
“/inc/” => “access 3 hours”,
“/jeditor/” => “access 3 hours”,
“/js/” => “access 3 hours”,
“/script/” => “access 3 hours”,
“/theme/” => “access 3 hours”,
“/upload/” => “access 3 hours”,
“/view/” => “access 3 hours”,
“/help/” => “access 3 hours”,
“/htm/” => “access 5 minutes”
)
设置Etag
在配置文件中增加,etag.use-inode=”disable”(i节点不参与etag的运算),保证多台服务器生成的Etag值一致。