第一篇 WEB压力测试


一、常用工具

常用压力测试工具:ab,httpd_load,webbench,seige。

仅仅作为测试使用,与实际能力区别也挺大的。

比较好的测试工具:惠普公司的loadrunning(收费,不好找),网易公司的tcpcopy,

二、ab

网站压力测试,模拟并发n个客户端同时发送n个请求,共m个并发请求。

前提条件:调高并发访问文件的最大限度 ulimit

[root@localhost php-5.5.32]# ulimit -n 3000


三、使用方法:

-c:模拟的并发用户数

-n:总的用户请求数量

[root@localhost php-5.5.32]# ab -c 10 -n 100 http://www.baidu.com/index.html

   //需要指明具体访问的文件,否则报错。

参考马哥教育ab测试:http://edu.51cto.com/lesson/id-75757.html

This is ApacheBench, Version 2.3 <$Revision: 1706008 $>

Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/

Licensed to The Apache Software Foundation, http://www.apache.org/


Benchmarking www.baidu.com (be patient).....done



Server Software:        BWS/1.1

Server Hostname:        www.baidu.com

Server Port:            80


Document Path:          /index.html

Document Length:        111566 bytes


Concurrency Level:      10并发等级,同时访问的用户数量

Time taken for tests:   3.484 seconds总耗时

Complete requests:      100完成响应数

Failed requests:        98失败请求数

   (Connect: 0, Receive: 0, Length: 98, Exceptions: 0)

Total transferred:      11246439 bytes

HTML transferred:       11151543 bytes

Requests per second:    28.71 [#/sec] (mean)每秒请求数

Time per request:       348.369 [ms] (mean)每10个请求消耗的时间

Time per request:       34.837 [ms] (mean, across all concurrent requests)每个请求消耗时间

Transfer rate:          3152.65 [Kbytes/sec] received传输速率


Connection Times (ms)

              min  mean[+/-sd] median   max

Connect:        2    6   4.6      5      30

Processing:    19  223 448.6     53    3479

Waiting:        4   23  48.1      9     212

Total:         22  230 448.8     59    3483


Percentage of the requests served within a certain time (ms)

  50%     59

  66%     76

  75%    298

  80%    341

  90%    736

  95%    864

  98%   1606

  99%   3483

 100%   3483 (longest request)

[root@localhost php-5.5.32]# 



第二篇 PHP缓存-xcache

一、Xcache加速器

使用方法:将xcache编译安装成PHP的一个模块。


二、安装使用:

1、下载源代码、解压缩

2、执行编译安装的php的phpize命令

[root@localhost xcache-3.2.0]# /usr/local/php/bin/phpize

Configuring for:

PHP Api Version:         20121113

Zend Module Api No:      20121212

Zend Extension Api No:   220121212

3、编译xcache

[root@localhost xcache-3.2.0]# ./configure --enable-xcache --with-php-config=/usr/local/php/bin/php-config

[root@localhost xcache-3.2.0]#make && make install

4、配置xcache.ini文件

可以将源码中的xcache.ini文件重定向追加到php.ini中,也可以在php.d目录下创建一个*.ini的文件,并修改配置文件。

[root@localhost xcache-3.2.0]# cat xcache.ini >> /etc/php.ini 

Or

[root@localhost xcache-3.2.0]# mkdir /etc/php.d

[root@localhost xcache-3.2.0]# cp xcache.ini /etc/php.d/



extension = xcache.so,保留默认即可。

[root@localhost xcache-3.2.0]# vim /etc/php.d/xcache.ini 


;; this is an example, it won't work unless properly configured into php.ini

[xcache-common]

;; non-Windows example:

extension = xcache.so


5、检查是否正确配置。

通过phpinfo这样的简单脚本即可检查xcache是否挂载上,如果没有挂载,可以检查php的配置文件检查位置是否和实际相同。

XCache

XCache Version 3.2.0 
Modules Built cacher 


DirectiveLocal ValueMaster Value
xcache.coredump_directoryno valueno value
xcache.disable_on_crashOffOff
xcache.experimentalOffOff
xcache.testOffOff

通过web页面查看缓存使用 情况及操作(此处实验环境是xcache3.2、php5.5)

未使用xcache进行缓存后压力测试结果

Concurrency Level:      1000

Time taken for tests:   17.992 seconds

Complete requests:      1000

Failed requests:        95

   (Connect: 0, Receive: 0, Length: 95, Exceptions: 0)

Total transferred:      82144897 bytes

HTML transferred:       81977897 bytes

Requests per second:    55.58 [#/sec] (mean)

Time per request:       17992.489 [ms] (mean)

Time per request:       17.992 [ms] (mean, across all concurrent requests)

Transfer rate:          4458.51 [Kbytes/sec] received


使用xcache进行压力测试结果:

Concurrency Level:      1000

Time taken for tests:   2.134 seconds

Complete requests:      1000

Failed requests:        905

   (Connect: 0, Receive: 0, Length: 905, Exceptions: 0)

Total transferred:      78216889 bytes

HTML transferred:       78049889 bytes

Requests per second:    468.66 [#/sec] (mean)

Time per request:       2133.730 [ms] (mean)

Time per request:       2.134 [ms] (mean, across all concurrent requests)

Transfer rate:          35798.19 [Kbytes/sec] received


a、将源代码中的htdocs目录下的文件拷贝到web服务器可以访问到的链接下、我这里是/usr/local/nginx/html/xcache。

b、编辑php.ini(xcache.ini)文件,为网页添加用户名密码,密码是md5加密的。

echo  -n password |openssl md5

c、vi /etc/php.ini

xcache.admin.user = "root"

xcache.admin.pass = "63a9f0ea7bb98050796b649e85481845"

d、重启php-fpm服务。

注意:检查文件版本是否存在相互支持的问题,比如xcache和php之间的版本是否支持,这样的问题适用于所有的安装情况!!!

官网xcache.ini配置文档:http://xcache.lighttpd.net/wiki/XcacheIni


memcached:缓存的是mysql查询的结果。并且缓存的每个数值不能超过1兆。

xcache:用来缓存有zend  engine引擎编译php脚本,实质上是opcode数据。

第三篇 memcached


一、memcached安装和配置

1、介绍

    在没有给memcached下定义之前,我先说几个要点,方便更好地理解memcached。

    首先memcached是一个分布式的高速缓存系统,分布式说明可以部署多个,并且他和应用服务器之间通讯是通过独立的文本协议完成的。另外memcached的缓存是缓存在内存中而不是硬盘上,所以称为高速。

    多个memcached之间并不相互通讯。memcached缓存的数据是由应用程序服务器决定的,而不是由自己。这样就要去应用程序服务器比如php在开发的时候就要支持memcached功能,否则部署没有意义。

    那么当有多个缓存服务器的时候,数据是如何缓存的呢,这里先说一下,由于缓存服务器之间不通讯,不存在同步缓存的事情,那么数据缓存之后,在查找缓存的时候就需要知道去×××的问题。

    数据缓存的方法有两种:取余法和一致性hash算法。

    取余法,就是对数据进行hash取余,并将结果放到指定的服务器上,缺点是如果增加新额设备,取余结果混乱,造成无法正确查找数据。

    一致性hash算法,这个比较复杂,简单说就是假定有这样一个环,对所有主机进行hash计算,然后通过2的32次幂的取余运算,并生成一个唯一的数作为服务器的id号,应用服务器在对数据查询的时候,会依据hash计算查询语句,并计算一个唯一值,同样放到这个环上,并顺时针查找离自己最近的缓存服务器,然后将数据缓存到这里。由于一致性hash算法的特定可能会造成这个环上服务器负责区域大小范围不同,所以提供了虚拟的功能,就是可以为同一个主机创建多个点,来平均分配区域。来实现区域的均衡。

    这样即使一台服务器添加或者缺失,只会影响一部分数据(数据顺时针查找的一个固定范围),只需应用服务器重新查找并缓存即可。

重点提示:由于缓存都是存储在内存中,所以重启memcached服务器会造成数据丢失,需要重新建立缓存。

memcached本身并不提供冗余功能,所以当一台缓存服务器故障后,和他关联的持久链接session就会失效造成数据丢失,这个是不能避免的。

解决此办法,而又可以实现高效的数据存储就出现了nosql和redis的技术。

D8F18F86FF6F46579FAB371DBC4AEDF6

图片来源:http://blog.csdn.net/sparkliang/article/details/5279393

视频来源memcached:http://edu.51cto.com/lesson/id-75819.html

2、安装

使用的端口:

11211:tcp 

11211:udp

依赖软件包:

libevent

    libevent提供高性能的网络代码库,并且目前很多主流的网络事件工具都是依据此库开发的。

2.1编译安装:(redhat可以通过yum方式自动完成memcached的安装,这里只是提供另一种安装方式)

a、安装libevent

[root@node6.dtedu.com ~/libevent-2.0.22-stable]# ./configure --prefix=/usr/local/libevent

[root@node6.dtedu.com ~/libevent-2.0.22-stable]# make && make install


将头文件和库文件导出到linux系统默认的路径,方便其他程序调用。

创建头文件的链接

[root@node6.dtedu.com ~/libevent-2.0.22-stable]# ln -sv /usr/local/libevent/incloud /usr/include/libevent 

"/usr/include/libevent" -> "/usr/local/libevent/incloud"

创建libevent.conf,添加/usr/local/libevent/lib。

[root@227 magedu.com]# cat /etc/ld.so.conf.d/libevent.conf

/usr/local/libevent/lib

动态链接库管理工具、执行此命令用于将新的库文件加载进内核。

[root@227 magedu.com]# ldconfig 

b、安装

下载并编译安装http://www.memcached.org/files/memcached-1.4.39.tar.gz

[root@node6.dtedu.com ~/memcached-1.4.39]# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent

[root@node6.dtedu.com ~/memcached-1.4.39]# make && make install


启动

[root@node6.dtedu.com ~/memcached-1.4.39]# vim /etc/profile.d/memcached.sh

[root@node6.dtedu.com ~/memcached-1.4.39]# . /etc/profile.d/memcached.sh 

[root@node6.dtedu.com ~/memcached-1.4.39]# cat /etc/profile.d/memcached.sh 

export PATH=/usr/local/memcached/bin/:$PATH

[root@node6.dtedu.com ~/memcached-1.4.39]# memcached -f 2 -d -u daemon



3、配置详解

命令配置:

.memcached -h

-p:指定tcp监听端口

-U:指定udp监听端口(启动时监听的端口地址,为了安全建议修改监听端口)

-l:指定监听的ip地址,当服务器有多个网卡的时候设置启动时监听的网卡地址(本机)

-d:以守护进程的方式运行,就是在后台运行。

-m:设置缓存大小,默认是64M,建议设置也不要太大,(2g足够)不方便内存管理。

-f:设置增长因子,就是缓存(内存划分大小)递增倍率。

-v:显示细节、可以看出内存分配增长的过程

4、编写启动脚本

vim /etc/rc.d/init.d/memcached

78BBE1A0D286488BBD6835ABB6EAFD41

问题:

service memcached does not support chkconfig

我们一般在脚本开头加入下面两句就好了

#gedit /etc/init.d/myservice

添加下面两句到 #!/bin/bash 之后。

# chkconfig: - 85 15# description: myservice ....

其中2345是默认启动级别,级别有0-6共7个级别。

  等级0表示:表示关机   

  等级1表示:单用户模式   

  等级2表示:无网络连接的多用户命令行模式   

  等级3表示:有网络连接的多用户命令行模式   

  等级4表示:不可用   

  等级5表示:带图形界面的多用户模式   

  等级6表示:重新启动

85是启动优先级,90是停止优先级,优先级范围是0-100,数字越大,优先级越低

参考文档:http://blog.csdn.net/tianhuadihuo/article/details/6647398

5、memcached常用命令

通过telnet连接memcached服务器,并对其进行操作。

[root@node6.dtedu.com ~/memcached-1.4.39]# telnet 10.40.0.226 11211

Trying 10.40.0.226...

Connected to 10.40.0.226.

Escape character is '^]'.

命令:

存储类命令:set、add、replace、append、prepend

获取数据类命令:get、delete、incr/decr

统计类命令:stats items、stats slabs、stats sizes

清理命令:flush_all

Memcached常用命令及使用说明:http://www.cnblogs.com/jeffwongishandsome/archive/2011/11/06/2238265.html

二、搭建PHP连接到缓存服务器的方法

1、概述

这里说明一下,PHP连接memcached服务器的插件有两种,一个叫memcach另一个叫memcached。他和缓存服务器的memcached同名不同义。

并且使用perl开发的应用程序服务器要和memcached进行通信使用的插件也叫memcached,而使用c或者c++开发的应用程序服务器连接memcached服务器使用的插件叫做libmemcached。

memcached作为服务器,客户端需要和他链接是需要“驱动”的。

memcached:服务器端,即安装的memcached服务,类似于mysql服务

memcache:使用pecl扩展库形式操作memcached(类似于php_mysqli)

memcached:使用libmemcached形式操作memcached



参考文件:http://www.cnblogs.com/wangtao_20/p/4057591.html

2、php安装驱动(插件)

这里安装的是memcache扩展库。

安装环境:php-5.5.32、memcache-2.2.7

A、下载客户端http://pecl.php.net/package/memcache

B、创建php的外挂模块(需要进入要安装的模块目录内)

[root@localhost mysqli]# /usr/local/php/bin/phpize 

Configuring for:

PHP Api Version:         20121113

Zend Module Api No:      20121212

Zend Extension Api No:   220121212


[root@localhost memcache-2.2.7]# ./configure --with-php-config=/usr/local/php/bin/php-config --enable-memcache


[root@localhost  memcache-2.2.7]# make 



[root@localhost memcache-2.2.7]#  make install

安装完毕会显示安装的路径                  

Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-zts-20121212/

创建并配置ini文件,添加内容如下:(这里主要检查php配置文件存放位置,我这里使用的是编译安装,配置文件指定的是/etc/php-fpm/目录)

[root@localhost memcache-3.0.8]# vim /etc/php-fpm/php.ini

extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/memcache.so

~                                                                                  

135439.tmp

重启php

service php-fpm restart(需要提前准备)



网页测试代码(index.php):

[root@ms.dtedu.com/usr/local/libmemcached/bin]$vim /www/magedu.com/index.php 


<?php

$memcache = new Memcache;

$memcache->connect('10.40.0.226', 11211) or die ("Could not connect");

$version = $memcache->getVersion();

echo "Server's version: ".$version."\n";

$tmp_object = new stdClass;

$tmp_object->str_attr = 'test';

$tmp_object->int_attr = 123;

$memcache->set('key', $tmp_objectfalse10) or die ("Failed to save data at the server");

echo "Store data in the cache (data will expire in 10 seconds)\n";

$get_result = $memcache->get('key');

echo "Data from the cache:\n";

var_dump($get_result);

?>




memcache实现跨服务器登录


文章来源:http://www.ningoo.net/html/2009/use_memcached_in_php.html

memcached客户端安装配置手册:http://php.net/manual/zh/memcached.installation.php

3、memadmin-master监控工具

错误汇总:

1、执行phpize过程中出现一下代码:

[root@localhost php-5.5.32]# /usr/local/php/bin/phpize 

Cannot find config.m4. 

Make sure that you run '/usr/local/php/bin/phpize' in the top level source directory of the module


解决方法:进入源码包的ext/mysqli目录再执行phpize即可。或者直接安装php-devel即可。

[root@localhost php-5.5.32]# cd ext/mysqli/

[root@localhost mysqli]# /usr/local/php/bin/phpize 

Configuring for:

PHP Api Version:         20121113

Zend Module Api No:      20121212

Zend Extension Api No:   220121212