分类目录归档:DevOps

haproxy做代理后端nginx获取客户端真实ip注意事项

当使用haproxy与nginx做负载均衡时,由于每次都是代理服务器与后端web服务器直接通信,
因此后端的web服务器为了获取用户的真实IP都要让代理服务器添加一个X-Forwarded-For header。
在haproxy里可以设置
option forwardfor header Client-IP
不过仅仅设置这个是不够的,这与haproxy的代理模式有关。haproxy使用的是”tunnel mode”,在文档里是这样说的
By default HAProxy operates in a tunnel-like mode with regards to persistent
connections: for each connection it processes the first request and forwards
everything else (including additional requests) to selected server. Once
established, the connection is persisted both on the client and server
sides. Use “option http-server-close” to preserve client persistent connections
while handling every incoming request individually, dispatching them one after
another to servers, in HTTP close mode. Use “option httpclose” to switch both
sides to HTTP close mode. “option forceclose” and “option
http-pretend-keepalive” help working around servers misbehaving in HTTP close
mode.

………………………..

It is important to note that by default, HAProxy works in tunnel mode and
only inspects the first request of a connection, meaning that only the first
request will have the header appended, which is certainly not what you want.
In order to fix this, ensure that any of the “httpclose”, “forceclose” or
“http-server-close” options is set when using this option.
这段说的非常清楚了,也就是在默认的情况下haproxy与客户端和服务端都是会话保持的了。如果有用户A、B同时
访问代理服务器,那么很可能只有第一个用户的header会被发给服务器。可以参考如下模型
[CON] [REQ1] [REQ2] … [RESP1] [RESP2] [CLO] …
所以如果我们想要让后端web服务器每次都能获取到用户的IP,在haproxy里只能添加
A.
option forwardfor header Client-IP
option httpclose # client–短连接–haproxy–短连接—webserver
或者
B
option forwardfor header Client-IP
option http-server-close #client–长连接–haproxy–短连接–webserver

但是此时haproxy与后端每次都只能使用短链接,实际上不是太理想。因为我们往往不希望代理服务器对每次处理用户的一个新请求都往服务器再新发一个请求。不过目前为止haproxy还不支持与后端服务器的keepalive,不知道在1.5里到底会不会实现。
People often ask for SSL and Keep-Alive support. Both features will complicate the code and render it fragile for several releases. By the way, both features have a negative impact on performance :

Having SSL in the load balancer itself means that it becomes the bottleneck. When the load balancer’s CPU is saturated, the overall response times will increase and the only solution will be to multiply the load balancer with another load balancer in front of them. the only scalable solution is to have an SSL/Cache layer between the clients and the load balancer. Anyway for small sites it still makes sense to embed SSL, and it’s currently being studied. There has been some work on the CyaSSL library to ease integration with HAProxy, as it appears to be the only one out there to let you manage your memory yourself.
Keep-alive was invented to reduce CPU usage on servers when CPUs were 100 times slower. But what is not said is that persistent connections consume a lot of memory while not being usable by anybody except the client who openned them. Today in 2009, CPUs are very cheap and memory is still limited to a few gigabytes by the architecture or the price. If a site needs keep-alive, there is a real problem. Highly loaded sites often disable keep-alive to support the maximum number of simultaneous clients. The real downside of not having keep-alive is a slightly increased latency to fetch objects. Browsers double the number of concurrent connections on non-keepalive sites to compensate for this. With version 1.4, keep-alive with the client was introduced. It resulted in lower access times to load pages composed of many objects, without the cost of maintaining an idle connection to the server. It is a good trade-off. 1.5 will bring keep-alive to the server, but it will probably make sense only with static servers.

However, I’m planning on implementing both features in future versions, because it appears that there are users who mostly need availability above performance, and for them, it’s understandable that having both features will not impact their performance, and will reduce the number of components.
之前nginx的upstream模块里面只支持http 1.0,不支持与后端服务器的keepalive。令人高兴的是现在开发版nginx的upstream模块里支持对后端服务器的keepalive了,测试了一下还不错

worker_processes 1;
events {
use epoll;
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main ‘$remote_addr – $remote_user [$time_local] “$request” ‘
‘$status $body_bytes_sent “$http_referer” ‘
‘”$http_user_agent” “$http_x_forwarded_for”‘;
access_log logs/access.log main;
sendfile on;
keepalive_timeout 65;
gzip on;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
proxy_http_version 1.1;
proxy_set_header Connection “”;
proxy_pass http://http;
proxy_set_header Host $host;
proxy_set_header Client_IP $remote_addr;
proxy_set_header X-Forwarded-By $server_addr:$server_port;

}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
upstream http{
server 10.13.20.3:80;
keepalive 200 single;
}
}
测试的时候可以看到每次请求后nginx没有直接关闭后后端服务器的链接,新的请求进来后后端服务器也没有新增链接。

从haproxy去年的邮件列表里看到过有用户提出的这个问题,Willy最后去回复了,估计以后haproxy也会支持的。

http://www.serverphorums.com/read.php?10,301582

Nginx+PHP 502错误

解决Nginx+PHP(FastCGI)遇到的502 Bad Gateway错误

  最近几天发现个别服务器出现流量不稳定的情况,具体的表现是,流量时而高,时而低,在流量低的时候发现系统的负载很小,几乎为0,但是过一会,负载又高上去,流量也上去,很是奇怪,查找了2天没有找到原因,后来看到一边文章,介绍了解决nginx出现502的错误现象,按照这个方法进行尝试,最终还是找到了问题的原因。

解决步骤如下:

1、查看当前的PHP FastCGI进程数是否够用:

netstat -anpo | grep “php-cgi” | wc -l

如果实际使用的“FastCGI进程数”接近预设的“FastCGI进程数”,那么,说明“FastCGI进程数”不够用,需要增大。

2、部分PHP程序的执行时间超过了Nginx的等待时间,可以适当增加nginx.conf配置文件中FastCGI的timeout时间,例如:

……
http
{
……
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
……
}
……

在做第一步的时候,系统当前的PHP FastCGI进程数明显超过了预设值的64这个数值,在电信的服务器上查看当前的PHP FastCGI进程数没有高于64这个数值,而且网通线路的活动连接明显高于电信的活动连接,准备到晚上的时候看看情况,结果到晚上22:30的时候,查看系统当前的PHP FastCGI进程数明显小于64预设值,当前的活动连接也比原来低很多,由此可以说明出现nginx不稳定的情况是由于服务器访问负载过大引起的,就是加上第二步的错误也不顶作用。

总结,php-cgi进程数不够用、php执行时间长、或者是php-cgi进程死掉,都会出现502错误。

502的解决方法

现象:
经过对php-fpm进程数的调整,从4一直到200,对于claroline来说,最优的结果是CPU数x2,多了或少了,都影响性能。
在用ab进行测试的时候,不论哪种情况,只要超过cpux2的时候,top中都会出现大量的lockf,性能便会下降。
但是无论怎么调整php-fpm和nginx的参数,并发超过200的时候,ab就会报length错误,并且是大量的错误。同时在nginx-error.log中,出现大量的“Connection reset by peer”(如果是socket的话,会出现“unix:/tmp/php.socket failed (61: Connection refused)”)。
并发数不超过200没有错误,250并发的时候,>64个php-fpm进程没错误;300并发需要128以上的进程数,并且每秒的页面数只能是最大值的1/4-1/5左右。
四核机器,php进程为8的时候,没有错误,也没有lockf,index的数目大约是220,为12的时候就成为170,16就成了120,48大约70,64大约50,128以上大约35。
网上说的方法,基本上都用遍了,仍然不能解决。

原因(只是自已猜测,没查到权威的解释):
nginx发起的连接数,远远超过了php-fpm所能处理的数目,导致端口(或socket)频繁被锁,造成堵塞。

解决思路:

把php-fpm分为两部分,每部分各听一个端口或socket,这样就减少了lock

方案:
1、fpm2的调整(FreeBSD下)
(1)复制php-fpm.conf为php-fpm2.conf,并修改占用的端口(socket)
(2)复制rc.d/php-fpm为rc.d/php-fpm2,进行修改,把所有的fpm都替换为fpm2,并添加:

  1. start_precmd=”${name}_prestart”
  2. php_fpm2_prestart()
  3. {
  4.         rc_flags=”-y /usr/local/etc/php-fpm2.conf”
  5. }

2、nginx的调整:

  1. upstream backend{
  2.    server 127.0.0.1:9000;
  3.    server 127.0.0.1:9002;
  4.   }
  5. server {
  6.           listen 80;
  7.           server_name a.b.cd.com;
  8.           charset utf-8;
  9.           location / {
  10.                   index index.php index.htm;
  11.                   root /var/www;
  12.               }
  13.           location ~ \.php$ {
  14.               root /var/www;
  15.               sendfile on;
  16.                fastcgi_pass backend
  17.   ……
  18.             }
  19. }

3、用socket的优化:
用md系统,要比普通文件系统快很多。

善后?
Session会不会遇到麻烦?

DNS服务器维护命令

检查named.conf文件语法:
named-checkconf [filename]
检查区域配置文件语法:
named-checkzone  zone [filename]

rndc   远程名称服务控制
用法:
rndc [ -c config ] [ -s server ] [ -p port ] [ -y key ] command [ command... ...]
-c config 
使用config-file 作为缺省的配置文件/etc/rndc.conf 的替代
-s server 
server是与 rndc 的配置文件中 server语句匹配的服务器的名字或地址。如果命令行没有提供服务器,会使用 rndc 配置文件中 options 语句中的 default-server子句所命名的主机。
-p port
发送命令到 TCP端口 port,以取代 BIND 9 的缺省控制通道端口 953
-y key
使用配置文件中的密钥 key_id。key_id 必须被 named 所知道,带有同样的算法和秘密字符串,以便成功通过控制消息的验证。如果没有指定,rndc 将首先在所用的服务器的 server 语句中查找 key 子句,或者如果没有为主机提供 server 语句,就查找options 语句中的 default-key子句。注意配置文件中包含有用于发送认证控制命令到名字服务器的共享秘密。因此它不应该是对所有用户可读性的。

command命令如下:

reload
重新载入配置文件和区文件

用法:
rndc reload

reload zone [class [view]]

重新载入指定的区文件

refresh zone [class [view]]

对指定的区进行维护

retransfer zone 
重新从主服务器传送指定的区文件

freeze [zone[class[view]]]  

冻结一个动态更新区的更新.如果没有指定的区,那么就冻结所有区的动态更新.这就允许对一个动态更新的区进行手工编辑.它也会导致日志文件中的变化被同步到主服务器,然后删除日志文件.在区被冻结时,所有的动态更新尝试都会拒绝.

thaw [zone[class[view]]]
解冻一个被冻结的动态更新区.它会导致服务器重新新从新载入区,并打开动态更新功能.

notify zone [class[view]]
重新发出去的notify消息

reconfig
重新载入配置文件和新的区,但不载入已经存在的区域文件,即使其已经被更改过.

stats
写服务器的统计信息到统计文件

querylog

触发请求日志

dumpdb [-all|-cache|-zone] [view ...]

转储服务器指定视图的缓存和/或区到转储文件中.如未指定,将转储所有视图.

stop [-p]

停止服务器.停止服务器之前,会将由动态更新或IXFR所做的最新修改第一时间被存入被修改区的区文件中.如果指定-p,会返回named的进程号.这样可以通过其它命令来查询服务是否停止.

halt [-p]
立即停止服务器,与stop不同的是,由动态更新或IXFR所做的最新修改没有被保存在区文件中.但是重新启动服务器时,将从日志文件向前滚动.

trace
将服务器的调试级别增加1

trace level 

指定服务器的调试级别

notrace
将调试级别设置为0

flush
刷新服务器的缓存

flushname 
name
刷新指定名称的缓存

status

显示服务器的状态

recursing
转储刷新服务器的缓存

validation [on|off] [view ...]
打开或关闭DNSSEC验证.注意dnssec-enable也需要设置成yes才会生效,缺省为打开.
这需要一个配置文件,由于所有与服务器的通信都使用依赖共享密钥的数字签名来认证,并且没有其它方式可以比配置文件提供更好的保密方式.rndc配置文件的缺省路径是/etc/rndc.conf,但也可以使用-c参数来指定一个其它路径.如果rndc没有找到配置文件,它将会查找/etc/rndc.conf(或者是BIND构建时由sysconfdir所定义的其它目录).rndc.key文件是由rndc-congen -a所生成的.

PHP性能优化

PHP优化对于PHP的优化主要是对php.ini中的相关主要参数进行合理调整和设置,以下我们就来看看php.ini中的一些对性能影响较大的参数应该如何设置。

# vi /etc/php.ini

(1) PHP函数禁用找到:

disable_functions =
该选项可以设置哪些PHP函数是禁止使用的,PHP中有一些函数的风险性还是相当大的,可以直接执行一些系统级脚本命令,如果允许这些函数执行,当PHP程序出现漏洞时,损失是非常严重的!以下我们给出推荐的禁用函数设置:

disable_functions = phpinfo,passthru,exec,system,popen,chroot,escapeshellcmd,escapeshellarg,shell_exec,proc_open,proc_get_status

需注意:如果您的服务器中含有一些系统状态检测的PHP程序,则不要禁用shell_exec,proc_open,proc_get_status等函数。

(2) PHP脚本执行时间找到:

max_execution_time = 30

该选项设定PHP程序的最大执行时间,如果一个PHP脚本被请求,且该PHP脚本在max_execution_time时间内没能执行完毕,则PHP不再继续执行,直接给客户端返回超时错误。没有特殊需要该选项可保持默认设置30秒,如果您的PHP脚本确实需要长执行时间则可以适当增大该时间设置。

(3) PHP脚本处理内存占用找到:

memory_limit = 8M

该选项指定PHP脚本处理所能占用的最大内存,默认为8MB,如果您的服务器内存为1GB以上,则该选项可以设置为12MB以获得更快的PHP脚本处理效率。

(4) PHP全局函数声明找到:

register_globals = Off

网络上很多关于PHP设置的文章都推荐将该选项设置为On,其实这是一种及其危险的设置方法,很可能引起严重的安全性问题。如果没有特殊的需要,强烈推荐保留默认设置!

(5) PHP上传文件大小限制找到:

upload_max_filesize = 2M

该选项设定PHP所能允许最大上传文件大小,默认为2MB。根据实际应用需求,可以适当增大该设置。

(6) Session存储介质找到:

session.save_path

 

如果你的PHP程序使用Session对话,则可以将Session存储位置设置为/dev/shm,/dev/shm是Linux系统独有的TMPFS文件系统,是以内存为主要存储方式的文件系统,比RAMDISK更优秀,因为可以使用DISKSWAP作为补充,而且是系统自带的功能模块,不需要另行配置。想想看,从磁盘IO操作到内存操作,速度会快多少?只是需要注意,存储在/dev/shm的数据,在服务器重启后会全部丢失。不过这对于Session来说是无足轻重的。

 

 

由于水平有限,有些还是不太明白为什么。如果有更好建议的欢迎随时补充!

0、用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说echo是语言结构,不是真正的函数,故把函数加上了双引号)。
PS:在单引号中,PHP不会自动搜寻变量、转义字符等,因此效率上快很多。而一般来说字符串是没有变量的,所以使用双引号会导致性能不佳。

1、如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。
PS:事实上,function、method、static method的速度不会有太大差异。具体可见“PHP函数的实现原理及性能分析【转载】”一文。

2、$row[’id’] 的速度是$row[id]的7倍。
PS:不太懂,貌似差异只有后者会先判断id这个宏是否存在,如果不存在则自动转变为字符串。

3、echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo $str1,$str2。

PS:如果使用echo $str1.$str2 就会需要 PHP 引擎首先把所有的变量连接起来,然后在输出,而echo $str1,$str2,PHP 引擎就会按照循序输出他们

4、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。
PS:像count、strlen这样的操作其实是O(1)的,因此不会带来太多消耗,当然避免每次循环都计算是比较好的策略。最好用foreach代替for,这个效率更高,如果考虑到foreach($array as $var)每次拷贝的消耗,可以使用foreach($array as &$var)这样的引用。

5、注销那些不用的变量尤其是大数组,以便释放内存。
PS:如果没有记错的话,unset($array)不会立刻释放内存,但随时释放是个好习惯。

6、尽量避免使用__get,__set,__autoload。

7、require_once()代价昂贵。
PS:require_once和include_once需要判重,因此效率上要低,但是5.2版本后效率问题已经基本解决。

8、include文件时尽量使用绝对路径,因为它避免了PHP去include_path里查找文件的速度,解析操作系统路径所需的时间会更少。
PS:支持,尽量少用iniset()来设置include_path。

9、如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER['REQUEST_TIME']要好于time()。
PS:$_SERVER['REQUEST_TIME']保存了发起该请求时刻的时间戳,而time()则返回当前时刻的Unix时间戳。

10、函数代替正则表达式完成相同功能。
PS:这种函数是指strtok、strstr、strpos、str_replace、substr、explode、implode等等。

11、str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。
PS:字符串操作比正则替换要快。

12、如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。
PS:需要考虑到内置函数和用户自定义函数的开销差异,恐怕这种做法得不偿失。

13、使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。
PS:php中switch支持数值和字符串变量,比C的switch要好用,建议使用。

14、用@屏蔽错误消息的做法非常低效,极其低效。
PS:有什么替代方法吗?没有的话还是不得不用的……

15、打开apache的mod_deflate模块,可以提高网页的浏览速度。

16、数据库连接当使用完毕时应关掉,不要用长连接。
PS:在连接之前,最好设置一下相应的超时机制,例如链接超时、读写超时、等待超时等。

17、错误消息代价昂贵。

18、在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。

19、递增一个全局变量要比递增一个局部变量慢2倍。

20、递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢3倍。

21、递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。

22、仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。

23、方法调用看来与类中定义的方法的数量无关,因为我(在测试方法之前和之后都)添加了10个方法,但性能上没有变化。

24、派生类中的方法运行起来要快于在基类中定义的同样的方法。

25、调用带有一个参数的空函数,其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。

26、Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面,少用脚本。

27、除非脚本可以缓存,否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能,以免除编译开销。

28、尽量做缓存,可使用memcached。memcached是一款高性能的内存对象缓存系统,可用来加速动态Web应用程序,减轻数据库负载。对运算码 (OP code)的缓存很有用,使得脚本不必为每个请求做重新编译。

29、当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数。此函数执行起来相当快,因为它不做任何计算,只返回在zval 结构(C的内置数据结构,用于存储PHP变量)中存储的已知字符串长度。但是,由于strlen()是函数,多多少少会有些慢,因为函数调用会经过诸多步骤,如字母小写化(译注:指函数名小写化,PHP不区分函数名大小写)、哈希查找,会跟随被调用的函数一起执行。在某些情况下,你可以使用isset() 技巧加速执行你的代码。

(举例如下)瑞士军刀背包威戈

if (strlen($foo) < 5) { echo “Foo is too short”$$ }

(与下面的技巧做比较)

if (!isset($foo{5})) { echo “Foo is too short”$$ }

调用isset()恰巧比strlen()快,因为与后者不同的是,isset()作为一种语言结构,意味着它的执行不需要函数查找和字母小写化。也就是说,实际上在检验字符串长度的顶层代码中你没有花太多开销。
PS:长见识了。

30、当执行变量$i的递增或递减时,$i++会比++$i慢一些。这种差异是PHP特有的,并不适用于其他语言,所以请不要修改你的C或Java代码并指望它们能立即变快,没用的。++$i更快是因为它只需要3条指令(opcodes),$i++则需要4条指令。后置递增实际上会产生一个临时变量,这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种,正如Zend的PHP优化器所作的那样。牢记这个优化处理不失为一个好主意,因为并不是所有的指令优化器都会做同样的优化处理,并且存在大量没有装配指令优化器的互联网服务提供商(ISPs)和服务器。

31、并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。

32、并非要用类实现所有的数据结构,数组也很有用。

33、不要把方法细分得过多,仔细想想你真正打算重用的是哪些代码?

34、当你需要时,你总能把代码分解成方法。
PS:分解成方法要适当,行数少使用频率高的方法尽量用直接写代码,可以减少函数堆栈开销;且方法嵌套不宜过深,否则大大影响PHP的运行效率。

35、尽量采用大量的PHP内置函数。

36、如果在代码中存在大量耗时的函数,你可以考虑用C扩展的方式实现它们。

37、评估检验(profile)你的代码。检验器会告诉你,代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序,评估检验总体上可以显示出代码的瓶颈。

38、mod_zip可作为Apache模块,用来即时压缩你的数据,并可让数据传输量降低80%。

39、在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情况下,尽量用file_get_contents,因为他的效率高得多!但是要注意file_get_contents在打开一个URL文件时候的PHP版本问题;
PS:这个要记住,尽量使用file_get_contents和file_put_contents,不需要自己判断文件句柄打开是否成功。

40、尽量的少进行文件操作,虽然PHP的文件操作效率也不低的;

41、优化Select SQL语句,在可能的情况下尽量少的进行Insert、Update操作(在update上,我被恶批过);

42、尽可能的使用PHP内部函数(但是我却为了找个PHP里面不存在的函数,浪费了本可以写出一个自定义函数的时间,经验问题啊!);
PS:内置函数比用户自定义函数效率高了将近一个数量级。

43、循环内部不要声明变量,尤其是大变量:对象(这好像不只是PHP里面要注意的问题吧?);
PS:这个必须的,变量过多或者过大时,每次重分配的开销就无法忽略。

44、多维数组尽量不要循环嵌套赋值;

45、在可以用PHP内部字符串操作函数的情况下,不要用正则表达式;

46、foreach效率更高,尽量用foreach代替while和for循环;

47、用单引号替代双引号引用字符串;
PS:晕,这个不就是第一条吗?

48、“用i+=1代替i=i+1。符合c/c++的习惯,效率还高”;

49、对global变量,应该用完就unset()掉;

VirtualBox:解决VirtualBox安装时libSDL-1.2.so.0()错误的问题。

为Centos6.2安装VirtualBox的时候,遇到了这样的错误:

error: Failed dependencies:
    libSDL-1.2.so.0()(64bit) is needed by VirtualBox-4.2-4.2.4_81684_el6-1.x86_64

原来安装VirtualBox需要SDL这个包,可以用yum安装,

yum install compat-libstdc++-33 SDL

其实,除了上面的以外还需要gcc, kernel-devel,make, libGL, qt, qt-devel, libXmu,例如,

yum install gcc kernel-devel make libGL qt qt-devel libXmu

好了,现在就可以安装VirtuaBox的rpm包了,

Flashcache使用的误区以及解决方案

flashcache是facebook释放出来的开源的混合存储方案,用ssd来做cache提升IO设备的性能.很多硬件厂商也有类似的方案,比如说LSI raid卡. 但是这个方案是免费的软件方案,而且经过产品的考验,具体参见:
主页:https://github.com/facebook/flashcache
开源混合存储方案(Flashcache):http://blog.yufeng.info/archives/1165
Flashcache新版重大变化:http://blog.yufeng.info/archives/1429

但是flashcache在使用中很多人会有个误区,导致性能很低。首先我们看下flashcache的设计背景和适用场景:

Introduction :
============
Flashcache is a write back block cache Linux kernel module. This
document describes the design, futures ideas, configuration, tuning of
the flashcache and concludes with a note covering the testability
hooks within flashcache and the testing that we did. Flashcache was
built primarily as a block cache for MyIsAM but is general purpose and
can be used by other applications as well.

它是为数据库这样的应用的离散读写优化。如果你用在了顺序读写,就有非常大的性能问题。
那么为什么呢?分析下: 继续阅读

linux系统如何查看系统性能

一般我们查看系统性能主要是在以下几个方面
1.用户使用CPU情况 展现为 %user
2.系统使用CPU情况 展现为 %sys
3.wio或iowait     展现为 %iowait 进程由于等待磁盘IO而使CPU处于空闲状态的比率
4.CPU的空闲率
5.CPU上下文的交换的比率,也有说明为CPU上下文的切换。即内存和寄存器中数据的切换
6.nice 这个还不是很明白是啥意思
7.real-time 还是未知
8.运行队列的长度
9.平均负载
继续阅读

nginx重写规则中某些特定正则表达式不生效的处理

nginx正则有些特殊的使用方法,在我们一台老旧的centos5测试平台上不正常。比如

([0-9]+)-([0-9]+)可以正常使用,但是换成(\d+)-(\d+)却不能使用。

一些特殊的nginx里面使用的正则表达式

. 换行符以外的所有字符

\w 匹配字母或数字或下划线或汉字

\s 匹配任意的空白符

\d 匹配数字

\b 匹配单词的开始或结束

^ 匹配字符串的开始

$ 匹配字符串的结束

* 重复零次或更多次

+ 重复一次或更多次

? 重复零次或一次

{n} 重复n次

{n,} 重复n次或更多次

{n,m} 重复n到m次

使用pcretest测试,是能支持上面的正则匹配的。但是nginx就是没生效。 继续阅读

Linux下查看IO繁忙的进程ID

开启IO监控:

sysctl vm.block_dump=1
#或
echo 1 >/proc/sys/vm/block_dump

开启后内核会将IO读写dump到日记,用dmesg查看:

dmesg

进程读写block到磁盘dm-0:

mysqld(7822): READ block 78196624 on dm-0
kjournald(529): WRITE block 211136 on dm-0
bash(8336): dirtied inode 7391146 (dmesg) on dm-0

统计当前占用IO最高的10个进程:

dmesg |awk -F: ‘{print $1}’|sort|uniq -c|sort -rn|head -n 10