【转】Mcrypt响应慢的一个原因

cfYu 2018-08-22 原文

 

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

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

  1. <?php
  2. $dmcryptText = “dummy”;
  3. $key = “foobar”;
  4. $size = mcrypt_get_iv_size(MCRYPT_BLOWFISH,MCRYPT_MODE_ECB);
  5.  
  6. $iv = mcrypt_create_iv($size); //注意这里
  7.  
  8. $m = mcrypt_ecb(MCRYPT_BLOWFISH, $key, $dmcryptText, MCRYPT_DECRYPT, $iv);
  9. var_dump($m);

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

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

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

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

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

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

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

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

  1. <?php
  2. $dmcryptText = “dummy”;
  3. $key = “foobar”;
  4. $size = mcrypt_get_iv_size(MCRYPT_BLOWFISH,MCRYPT_MODE_ECB);
  5.  
  6. $iv = mcrypt_create_iv($size, MCRYPT_DEV_URANDOM); //注意这里
  7.  
  8. $m = mcrypt_ecb(MCRYPT_BLOWFISH, $key, $dmcryptText, MCRYPT_DECRYPT, $iv);
  9. var_dump($m);

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

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

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

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

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

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

原文地址: http://www.laruence.com/2012/09/24/2810.html

版权声明:本文为cfYu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/cfYu/p/9520515.html

【转】Mcrypt响应慢的一个原因的更多相关文章

随机推荐

  1. shell2(随机数、主机存活、批量建用户)

    语法缩进,使用四个空格;多加注释说明。 命名建议规则:变量名大写、局部变量小写,函数名小写,名字体现出实际作用 […]...

  2. 前端工程师常去的网站

    前端工程师常去的网站 基础性的学习网站: w3school:http://www.w3school.com.c […]...

  3. MySql取得日期(前一天、某一天) – 阳光下的小草

    MySql取得日期(前一天、某一天) 取得当天: SELECT curdate(); mysql> SE […]...

  4. TPFrame框架之robot模块的基本使用

    经过几天的努力,基本功能版已经完成,有待大家验证… robot插件主要的功能是帮助我们写部分代码的 […]...

  5. spring-boot-2.0.3不一样系列之shiro – 搭建篇

    前言        上一篇:spring-boot-2.0.3不一样系列之国际化,讲了如何实现国际化,实际上我 […]...

  6. 往事不堪回首

      开局一张图,内容全靠编 从12年大学毕业到如今,兜兜转转,依然在码工,码农,码代码的路上徘徊着,从最初的用 […]...

  7. JQuery 实现文件下载的常用方法分析

    本文实例讲述了JQuery 实现文件下载的常用方法。分享给大家供大家参考,具体如下:GET方式window.location.href = url; 亲测有效POST方式var url = "下载接口地址";// 构造隐藏的for...

  8. 汇编函数阅读笔记

    memset 原型 void memset(void* p_dst, char ch, int size) 这 […]...

展开目录

目录导航