美文网首页
一次简单的php请求redis会有哪些开销?

一次简单的php请求redis会有哪些开销?

作者: yanfeizhang | 来源:发表于2019-08-14 19:46 被阅读0次

    前面说了这么多,可能有的同学就会想了:“我是应用层的开发,这么底层的开销和我有什么关系?”。我想说的是,如果你只是一个初级或者中级开发工程师,这些确实没有必要了解。但是如果你想成为一名高级、或者是资深开发工程师,那么你应该具备大致估算你手下写出的每一行代码开销的能力。

    在经过了前面多篇文章的历练,相信大家对系统调用、进程上下文切换、软中断的开销也有了拿捏。那么接下来让我们用一个实践中php最简单的例子来演练一下。

    测试代码:

    <?php  
        $redis = new Redis();  
        $redis->connect('*.*.*.*', 6339);  
    
        sleep(60);  
        echo "Test begin\n";    
        for($i=0; $i<10000; $i++){  
            $redis->get('test');  
        }     
        echo "Test end!\n ";      
        sleep(60);  
    

    例子非常的简单,就是一句后端同学代码里经常出现的从Redis里获取了一条数据而已。那么让我们看看它到底会产生哪些开销?

    1.系统调用

    平均每次get都需要进行多次系统调用才可完成。

    # strace -c php main.php  
    % time     seconds  usecs/call     calls    errors syscall  
    ------ ----------- ----------- --------- --------- ----------------  
     97.24    0.039698           1     30003           poll  
      2.20    0.000899           0     10003           sendto  
      0.30    0.000122           0     10000           recvfrom  
      0.13    0.000053           0     10069           gettimeofday  
      0.03    0.000013           2         6           socket  
      0.03    0.000012           0       408           munmap  
      0.02    0.000008           0       657           read  
    
    

    2、进程上下文切换

    每次get都会导致进程进入主动上下文切换。

    # php main.php  
    

    然后再另起一个控制台,分别赶在实验开始前和实验开始后执行如下两行命令:

    # grep ctxt /proc/14862/status  
    voluntary_ctxt_switches:        4  
    nonvoluntary_ctxt_switches:     43  
      
    # grep ctxt /proc/14862/status  
    voluntary_ctxt_switches:        10005  
    nonvoluntary_ctxt_switches:     49  
    

    3、软中断

    软中断

    # cat /proc/softirqs  
                    CPU0       CPU1       CPU2       CPU3  
          HI:          0          0          0          0  
       TIMER:  196173081  145428444  154228333  163317242  
      NET_TX:          0          0          0          0  
      NET_RX:  178159928     116073      10108     160712  
    
         
    # cat /proc/softirqs  
                    CPU0       CPU1       CPU2       CPU3  
          HI:          0          0          0          0  
       TIMER:  196173688  145428634  154228610  163317624  
      NET_TX:          0          0          0          0  
      NET_RX:  178170212     116073      10108     160712  
    

    该虚机的软中断亲和性在CPU0上,178170212-178159928 = 10284(多出来的284是机器上其它的小服务)。

    个人公众号“开发内功修炼”,打通理论与实践的任督二脉。

    总结

    看似一次非常简单的redis get操作就会把所有系统态的高开销操作都涉及到了。一次进程上下文切换、一次软中断、若干次系统调用。 其实除了上面这些容易评估到的开销外,还有如L1、L2 cache miss,以及TLB cache miss这些在进程被切换掉的时候也会有额外的开销。

    相关文章

      网友评论

          本文标题:一次简单的php请求redis会有哪些开销?

          本文链接:https://www.haomeiwen.com/subject/algnjctx.html