第一篇 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 |
Directive | Local Value | Master Value |
---|---|---|
xcache.coredump_directory | no value | no value |
xcache.disable_on_crash | Off | Off |
xcache.experimental | Off | Off |
xcache.test | Off | Off |
通过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的技术。
图片来源: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
问题:
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
~
重启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_object, false, 10) 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
[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