NFS架构下使用realpath_turbo优化php性能

PHP进程调试中出现大量lstat系统调用,通过编译realpath_turbo模块,开启同时支持open_basedir和realpath_cache_size,优化PHP性能
生产系统架构
程序和数据大概500G,存放在一台ECS上,开启了NFS共享给若干台Nginx服务器进行读写,包括共享session也存于NFS分区。数据下一步准备迁移到OSS.
在系统运行中发现NFS的读写效率较低,调节NFS的缓存参数也无改善。例如通过记录PHP慢日志,看到大量session_start执行很慢:于是将session存储方式由文件改为redis,得以解决。
在google搜索NFS+session_start的过程中,发现了一篇老外的神贴:
http://php.webtutor.pl/en/2011/06/02/running-php-on-nfs-huge-performance-problems-and-one-simple-solution/

文中提到了在NFS下面php的性能问题:由于php程序中需要使用大量的require和include,导致出现大量lstat系统调用,大大降低程序性能。虽然没有明确阐述,但我理解,NFS下这个问题会比较明显。立即在生产系统中采用strace命令进行统计分析:

通过strace跟踪php-fpm详细的lstat调用规律#pgrep用法:#-n匹配最新(最近生成的)符合所有其它匹配条件的进程#-o匹配最旧(最早生成的)符合所有其它匹配条件的进程strace -c -p $(pgrep -n php-fpm)

果然看到 lstat 占比排第一(由于现在生产系统已经调优,无法再捕获结果,参考上述文档)
通常调优这个问题可以通过在php.ini(或php-fpm.conf)修改realpath_cache_size和realpath_cache_ttl这两个参数即可:
realpath_cache_size: php进程所使用的真实路径缓冲区的大小,默认16Krealpath_cache_ttl: 缓存时间,默认120秒
将以上两个参数适当加大,即可减少lstat的调用次数。
但是当php设置了open_basedir或者开启了safe_mode时,这两个参数将不再生效,见 http://bugs.php.net/bug.php?id=52312open_basedir的作用是限制php的读取目录,是必要的安全设置,当然不能取消。要想同时开启二者,就要引入大神的realpath_turbo模块了。github地址:https://github.com/Whissi/realpath_turbo
编译安装:
cd ~wget https://github.com/Whissi/realpath_turbo/archive/master.zip -O realpath_turbo.zipunzip realpath_turbo.zip cd realpath_turbo-master//usr/local/php_5.3.29/bin/phpize ./configure --with-php-config=/usr/local/php_5.3.29/bin/php-config makemake test NO_INTERACTION=1make installecho extension=realpath_turbo.so >> /usr/local/php_5.3.29/lib/php.ini

中间遇到一个编译错误:
/root/realpath_turbo-master/realpath_turbo.c: In function ‘zm_activate_realpath_turbo’:/root/realpath_turbo-master/realpath_turbo.c:43: warning: initialization makes pointer from integer without a cast/root/realpath_turbo-master/realpath_turbo.c:76: error: invalid type argument of ‘unary *’ (have ‘int’)make: *** [realpath_turbo.lo] Error 1

打开realpath_turbo.c,去掉74-83行,这段是判断是否开了safe_mode,如果开了编译就不通过。因为没有开safe_mode,直接删掉。
由于使用了php-fpm,将模块的配置放到了php-fpm.conf中
php_value[open_basedir] = ""php_value[realpath_turbo.disable_dangerous_functions] = 1php_value[realpath_turbo.open_basedir] = "/home1/wwwroot/public_html:/home1/tmp/:/home1/log/"php_value[realpath_cache_size] = 20mphp_value[realpath_cache_ttl] = 3600``重启php-fpm,在phpinfo中看到realpath_turbo模块已经加载。
再次进行strace,可以看到lstat已经不在占用最多时间,优化完成。

更多PHP相关技术请搜索千锋PHP,做真实的自己,用良心做教育。
互联网+时代,时刻要保持学习,携手千锋PHP,Dream It Possible。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容