🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
ab -c 10 -n 100 http://localhost/project/moodle33/ \-c10表示并发用户数为10 \-n100表示请求总数为100 http://a.ilanni.com/index.php表示请求的目标URL 这行表示同时处理100个请求并运行10次index.php文件。 D:\\xampp\\apache\\bin>ab -n1000 -c100 http://localhost/project/moodle33/ This is ApacheBench, Version 2.3 Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking localhost (be patient) Completed 100 requests Completed 200 requests Completed 300 requests Completed 400 requests Completed 500 requests Completed 600 requests Completed 700 requests Completed 800 requests Completed 900 requests Completed 1000 requests Finished 1000 requests Server Software: Apache/2.4.23        表示被测试的Web服务器软件名称。 Server Hostname: localhost                    表示请求的URL主机名。 Server Port: 80                                         表示被测试的Web服务器软件的监听端口。 Document Path: /project/moodle33/         表示请求的URL中的根绝对路径,通过该文件的后缀名,我们一般可以了解该请求的类型 Document Length: 27722 bytes                表示HTTP响应数据的正文长度。 Concurrency Level: 100                             表示并发用户数,这是我们设置的参数之一。 Time taken for tests: 24.916 seconds       表示所有这些请求被处理完成所花费的总时间 Complete requests: 1000                               表示总请求数量,这是我们设置的参数之一。 Failed requests: 0                                      表示失败的请求数量,这里的失败是指请求在连接服务器、发送数据等环节发生异常,以及无响应后超时的情况。如果接收到的HTTP响应数据的头信息中含有2XX以外的状态码,则会在测试结果中显示另一个名为“Non-2xx responses”的统计项,用于统计这部分请求数,这些请求并不算在失败的请求中。 Total transferred: 28378000 bytes               表示所有请求的响应数据长度总和,包括每个HTTP响应数据的头信息和正文数据的长度。注意这里不包括HTTP请求数据的长度,仅仅为web服务器流向用户PC的应用层数据总长度。 HTML transferred: 27722000 bytes                  表示所有请求的响应数据中正文数据的总和,也就是减去了Total transferred中HTTP响应数据中的头信息的长度。 Requests per second: 40.13 \[#/sec\] (mean)      (每秒并发数)吞吐率,计算公式:Complete requests/Time taken for tests Time per request: 2491.600 \[ms\] (mean)            用户平均请求等待时间,计算公式:Time token for tests/(Complete requests/Concurrency Level)。 Time per request: 24.916 \[ms\] (mean, across all concurrent requests)      服务器平均请求等待时间,计算公式:Time taken for tests/Complete requests,正好是吞吐率的倒数。也可以这么统计:Time per request/Concurrency Level。 Transfer rate: 1112.25 \[Kbytes/sec\] received          表示这些请求在单位时间内从服务器获取的数据长度,计算公式:Total trnasferred/ Time taken for tests,这个统计很好的说明服务器的处理能力达到极限时,其出口宽带的需求量。 Connection Times (ms) min mean\[+/-sd\] median max Connect:          0           0                   0.5              0             5 Processing:    164       2471             1005.1         2575     6998 Waiting:           117      1511             1100.0         1166      6626 Total:               164      2471             1005.1        2576      6998 Percentage of the requests served within a certain time (ms毫秒)      这部分数据用于描述每个请求处理时间的分布情况,比如以上测试,80%的请求处理时间都不超过3078ms,这个处理时间是指前面的Time per request,即对于单个用户而言,平均每个请求的处理时间。 50% 2576 66% 2810 75% 2961 80% 3078 90% 3557 95% 4226 98% 4881 99% 5088 100% 6998 (longest request) # LNMP下PHP网站性能压力测试工具WebBench安装教程 依赖: yum install ctags wget make apr\* autoconf automake gcc gcc-c++ 已经确定ctags 是必须的否则安装不了 随便找个目录 一下载webbench wget [http://home.tiscali.cz/cz210552/distfiles/webbench-1.5.tar.gz](http://home.tiscali.cz/cz210552/distfiles/webbench-1.5.tar.gz) #下载 二、安装webbench tar zxvf webbench-1.5.tar.gz       #解压 cd webbench-1.5                       #进入解压目录 make #编译  make install #安装 ~~~ make && make install ~~~ 三、压力测试 webbench -c 500 -t 30 [http://127.0.0.1/](http://127.0.0.1/) 参数说明: \-c 500:表示同时产生500个并发连接 \-t 30:表示持续30秒 备注:webbench最大可以模拟30000个并发连接 ~~~ $ webbench -c 500 -t 30 http://119.23.16.104:81/api/login/login_te # 参数说明:-c表示并发数,-t表示时间(秒) Webbench - Simple Web Benchmark 1.5 Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software. # 模拟500个客户端在30秒内向接口发送请求 Benchmarking: GET http://hostname/api/login 500 clients, running 30 sec. # 每秒钟传输数据量:每分钟平均有22578次请求连接,服务器每秒传输字节为122599。 Speed=22578 pages/min, 122599 bytes/sec. 备注:1GB=1024MB 1MB=1024KB 1KB=1024Byte ~~~ ~~~ # 每秒钟相应请求数:在30秒期间请求连接成功为11289次,失败0次。 Requests: 11289 susceed, 0 failed. ~~~ LNMP优化的手段主要包括 文件句柄数量([详情](https://blog.csdn.net/yetugeng/article/details/88902976)) ~~~ #查询linux相关的参数(open files 为最大文件句柄数 默认1024) ulimit -a #动态修改最大文件句柄数(只对当前进程有效): ulimit -n 2048 #永久修改最大文件句柄数:vi /etc/security/limits.conf 添加 *  soft  nofile  65536 #软限制 *  hard  nofile  65536 #硬限制 #分析句柄数:   (1)统计各进程打开句柄数:lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr (2)统计各用户打开句柄数:lsof -n|awk '{print $3}'|sort|uniq -c|sort -nr (3)统计各命令打开句柄数:lsof -n|awk '{print $1}'|sort|uniq -c|sort -nr ~~~ PHP 缓存 ~~~ 推荐php5.5默认的opcache linux安装php时记得加上 --enable-opcache ~~~ Nginx编译 Nginx pagespeed Nginx 缓存 Nginx 压缩 Nginx CPU绑定 ### Nginx处理PHP请求的流程 ~~~ 第一步:服务器接收请求若发现是PHP请求则转入第2步 第二步:通过socket方式连接PHP-FPM的FastCGI,让PHP-FPM处理请求。 第三步:获取PHP-FPM处理结果,并附加HTTP报头,返回给客户端。 ~~~ ### 提高Nginx的PHP并发性 ~~~ #1、调整Nginx的并发连接数 worker_connections 51200;#每个worker进程能并发处理的最大连接数(包含所有连接数) 理论上单台Nginx服务器的最大连接数为 worker_processes * worker_connections #Nginx要开启的进程数量 一般为当前机器CPU核心数量的1到2倍 例如2个四核CPU则计算为8 worker_processes auto; #2、调整PHP-FPM的并发连接数 # 3、永久修改系统最大打开文件数量:vim /etc/security/limits.conf # * 表示所有用户,noproc表示最大进程数量 * soft noproc 11000 * hard noproc 11000 # * 表示所有用户,nofile表示最大文件打开数量 * soft nofile 65535 * hard nofile 65535 #4、配置文件:vim /usr/local/nginx/conf/nginx.conf #一个nginx进程打开文件描述符的最大数量,建议与Linux的ulimit -n的值保持一致 worker_rlimit_nofile 51200; #启用epoll use epoll; #keepalive超时时间 keepalive_timeout 60; #客户端请求头部的缓冲区大小,可根据系统分页大小(通过getconf PAGESIZE命令显示的值 返回的值时Bytes)来设置,一般请求头大小不超过1KB client_header_buffer_size 32k; HTTP配置 ~~~ http { ~~~ # KeepAlive 超时时长 keepalive_timeout 60; # 客户端请求内容的缓存区大小 client_body_buffer_size 64K; # 客户端请求头部的缓冲区大小,可以根据系统的分页大小来设置。 client_header_buffer_size 8K; large_client_header_buffers 4 128K; # 客户端请求内容的最大值 client_max_body_size 8m; # 打开文件的缓存,max是指缓存的最大数量,inactive指缓存过期时间。 open_file_cache max=1024 inactive=30s; # 检查缓存的有效时间 open_file_cache_valid 30s; # inactive参数的时间内文件的最少使用次数,若超过则保持缓存的打开状态。 open_file_cache_min_uses 1; # 读取FastCGI返回信息的缓冲数量和大小 fastcgi_buffers 8 32k; # 读取FastCGI服务器响应头部的缓冲区大小 fastcgi_buffer_size 128k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; # 连接到后端FastCGI的超时时间 fastcgi_connect_timeout 120; # 向FastCGI传送请求的超时时间 fastcgi_send_timeout 120; # 接收FastCGI应答的超时时间 fastcgi_read_timeout 120; } PHP-FPM 设置: vim /usr/local/php/etc/php-fpm.conf # # 进程管理方式: #动态方式(动态dynamic)适合小内存机器,静态方式(静态static)适用于大内存机器。动态方式,灵活分配进程,比较节省内存,但同时动态创建回收进程对服务器资源也是一种消耗,受到pm.max_spare_servers参数的影响 pm = dynamic # 最大子进程数量,决定了php-fpm的总进程数量。 pm.max_children = 100 pm.start_servers = 30 pm.min_spare_servers = 20 pm.max_spare_servers = 100 # 每个子进程重启之前服务的请求数量,存在内存泄漏时比较有用。 # 最大请求数量,php-fpm进程响应500个并发请求后会自动重启进程。 pm.max_requests = 500 # 请求客户端延迟,表示等待100秒后会自动结束那些没有自动结束的php脚本以释放占用的资源。 request_terminate_timeout = 100 # 打开文件描述符的限制,可使用ulimit -n查看 rlimit_files = 65535 #提高Nginx和php-fpm通信的稳定性 ~~~ ## MySQL MySQL默认配置为`my.cnf`,系统已提供可选的配置文件。 ~~~ $ ll /usr/local/mysql/share/mysql/ # 适合1GB~2GB的RAM my-huge.cnf # 适合512MB的RAM my-large.cnf # 适合32MB~64MB的RAM my-medium.cnf # 适合小于64MB的RAM my-small.cnf # 适合4G+的RAM my-innodb-heavy-4G.cnf ~~~ ## 硬件负载 在压测期间,可使用`top`命令,观察目标服务器上性能变化。 ~~~ # 查看CPU负载情况 $ top # 查看内存使用情况 $ free -m # 查看磁盘IO情况 $ iostat -kx 2 # 查看网络流量情况 # sar -n DEV 2 ~~~