IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Mcrypt响应慢的一个原因

    Laruence发表于 2012-09-24 04:23:30
    love 0
    • 作者: Laruence( )
    • 本文地址: http://www.laruence.com/2012/09/24/2810.html
    • 转载请注明出处

    上午的时候, 有同事来找我说上周新上线的一个使用mcrypt的脚本, 响应非常慢, 但是服务器的各项指标都正常, 不知道是什么原因.

    经过了解, 一个简单的可重现的脚本如下:

    
    

    当20个并发请求这个脚本的时候, 我们会发现Apache的响应时间急剧上升…

    考虑到这个问题可能具有一定的普遍性, 于是我想我还是写一篇文章来介绍下这个坑, 防止后来人再次踩到.

    PHP的Mcrypt扩展的mcrypt_create_iv, 如果你不指定的话, 默认使用/dev/random(Linux上), 作为随机数产生器. (也许有的同学已经知道原因了, 呵呵, 那就可以略过了)

    这里的问题就在于/dev/random, 它的random pool依赖于系统的中断来产生. 当系统的中断数不足, 不够产生足够的随机数, 那么尝试读取的进程就会等待, 也就是会hang住, 来看一个简单的例子:

    $ dd if=/dev/random bs=1024k count=1
    

    当你的机器不够繁忙的时候, 你会发现, 输出的速度很慢, 偶尔还有停顿…

    问题就出在了这里, 当你20个并发请求的时候, 服务器的中断数不够, 产生不了足够的随机数给mcrypt, 继而导致PHP进程等待, 从而表现出, 响应时间变长

    解决的办法就是, 改用/dev/urandom, /dev/urandom也是一个产生随机数的设备, 但是它不依赖于系统中断.

    
    

    修改后测试, 问题解决, 一切正常….

    Weibo上SAE的同学 @胥昕ops提供了一个不需要修改PHP代码的解决方案:

    胥昕ops: SAE 二三月份遇到的这个问题,一条命令秒杀此问题,

    $ rngd -r /dev/urandom -o /dev/random -t 1
    

    用urandom的结果填充entropy池子,这样既保证了entropy池的数量,也保证了随机性

    然而, 为什么PHP使用/dev/random作为默认, 这是因为理论上来说, /dev/urandom在一定的情况下, 可能会被可预测(参看: /dev/random), 所以一般上认为, /dev/urandom不如/dev/random安全.

    后记, 大家看手册, 一定也要看手册下面的评论, 呵呵, 有很多东西在评论中, 是有提到的, 如下面这条评论, 来自mcrypt_create_iv:

    If you use /dev/random you need a well filled entropy pool or the application will block until enough good entropy comes available


    Comments

    • 2012/09/24, Kearney writes: very good
    • 2012/09/24, wiwi writes: 那用MCRYPT_RAND 会有问题吗?
    • 2012/09/24, 奇言妙事-文学奇谈小小说阅读xlinblog.sinaapp.com » Mcrypt响应慢的一个原因 writes: [...] 本文地址: http://www.laruence.com/2012/09/24/2810.html [...]
    • 2012/09/24, Mcrypt响应慢的一个原因 | Father Milk writes: [...] 本文地址: http://www.laruence.com/2012/09/24/2810.html [...]
    • 2012/09/24, Jason Gian writes: 鸟哥v5
    • 2012/09/25, kulv2012 writes: 去年项目中也遇到过这个问题,后来改为URANDOM就OK了
    • 2012/09/26, hytest writes: /dev/random的wiki链接错了,应该是: http://en.wikipedia.org/wiki//dev/random
    • 2012/09/26, 雪候鸟 writes: @hytest thanks, 已修正
    • 2012/09/27, 石家庄星座约会 writes: 石家庄星座约会 以星座为主题的同城约会,爱情交友,目前只同意女生加群。 Q群:235893866
    • 2012/09/29, Mcrypt响应慢的一个原因树林/咖啡 成都专业php网站制作 | 树林/咖啡 成都专业php网站制作 writes: [...] 风雪之隅 » PHP应用 Posted in: php / Tagged: Mcrypt响应慢的一个原因 [...]
    • 2012/10/01, 真人娱乐 writes: 你好,楼主,可以跟你交换链接吗?
    • 2012/10/04, Pride Chung writes: 这个很坑爹,我看见很多PHP的框架都有用到 Mcrypt
    • 2012/10/08, 培训的目的 writes: 这个是一个很有用的小提示,请问作者在哪个城市?
    • 2012/10/08, 南京搬家公司 writes: 过节之后先来博主博客看看..不知道博主过的怎么样哦?南京搬家公司http://www.bjhxrnj.com永远支持博主!
    • 2012/10/09, 王鹏你妹 writes: 王鹏你妹!汪你妹!据说现在这个很火啊!http://www.wangnimei.com/
    • 2012/10/10, 硬密封蝶阀 writes: 写得很好啊。
    • 2012/10/12, 盒子 writes: mark.
    • 2012/11/06, shenzhe writes: mt_rand相关函数也要有URANDOM这个参数就好了。 鸟哥,整个呗。
    • 2013/02/25, sanreqi writes: 不错收藏了
    • 2013/03/06, jim writes: 支持鸟哥
    • 2013/03/19, chenlong writes: mark一下。向鸟哥学习!
    • 2013/04/14, Just Write something | 哎呀哪里会有鱼 writes: [...] 其实随机数也是个坑,以前同事有遇到过这个问题,主要是由于memcached中随机数产出问题导致访问巨慢的问题,详见 laruence 大牛写的这篇blog。 [...]
    • 2013/04/29, Mcrypt响应慢的一个原因 | 午后小憩 writes: [...] 本文地址: http://www.laruence.com/2012/09/24/2810.html [...]
    • 2014/12/29, Joffe writes: 定期来看干货
    • 2015/05/10, php oauth v1.0 详解客户端和服务端流程与实现 | 柏新星 writes: [...] 具体性能信息请参考:/dev/random    Mcrypt响应慢的一个原因 [...]

    Copyright © 2010 风雪之隅 版权所有, 转载务必注明. 该Feed只供个人使用, 禁止未注明的转载或商业应用. 非法应用的, 一切法律后果自负. 如有问题, 可发E-mail至my at laruence.com.(Digital Fingerprint: 73540ba0a1738d7d07d4b6038d5615e2)

    Random Posts:

    • Yaf-一个PHP扩展实现的PHP框架
    • Serialize/Unserialize破坏单例
    • 通过访客分布看中国IT业的发展
    • Dom事件的srcTarget,strElement探幽
    • PLua – Lua for PHP
    • 深入理解PHP原理之Session Gc的一个小概率Notice
    • 深入理解PHP原理之文件上传
    • 之前提到的PHP5.4一个注意点的update
    • JS文件装载器(Eve Js Loader)
    • PHP5.5或将引入Generators


沪ICP备19023445号-2号
友情链接