实验要求: javascript
1、总体目标php
安装虚拟机,并安装一套LAMP(Linux+Apache+Mysql+PHP)待测系统,推荐ECShop(http://www.ecshop.com),基于此进行Jmeter压力测试,并在测试后得出Jmeter测试报告,并根据sysstat得出Linux服务器的CIMN(CPU、IO、Memory以及Network)的性能。html
2、队员分工html5
3、实验要求java
i. 报告封皮node
1) 实验名称、团队名称、队长、成员以及每一个人完成任务的信息mysql
ii. 实验相关内容:git
1) Linux下top命令结果截图github
2) 访问的B/S系统截图sql
3) Jmeter的Testplan展开截图
4) Beanshell代码
5) 运行Jmeter测试以后的Aggregate Report Result
6) 运行Jmeter测试以后的服务器性能
4、 参考
实验步骤:
1、安装LAMP
安装apache2
sudo apt-get update sudo apt-get install apache2
安装MySQL
sudo apt-get install mysql-server mysql-client
安装PHP5.6
sudo add-apt-repository ppa:ondrej/php //换源 sudo apt-get update sudo apt-get install php5.6 sudo apt-get install libapache2-mod-php5.6 sudo apt-get install php5.6-mysql php5.6-gd
提示:由于Ubuntu16.04默认下载的php版本是7.0,而 ecshop比较老,存在兼容性问题,因此卸载了php7.0再下载php5.6,卸载php:
sudo aptitude purge `dpkg -l | grep php| awk '{print $2}' |tr "\n" " "`
2、安装ECShop
一、下载ECShop,解压缩后将upload文件夹放在/var/www/html目录下,命名为ecshop,在浏览器中打开localhost/ecshop
检测环境的时候提示:是否支持 JPEG是不支持的。 解决:查看发现有libjpeg.lib库,GD2库也有,都加载了,也都正常。查看ecshop源代码发现var/www/html/ecshop/install/includes/lib_installer.php中第98行,JPEG写成了JPG,正确的应该是: $jpeg_enabled = ($gd_info['JPEG Support'] === true) ? $_LANG['support'] : $_LANG['not_support'];
二、安装ecshop遇到的问题
(1)Deprecated: preg_replace() 报错,错误缘由:preg_replace() 函数中用到的修饰符 /e 在 PHP5.5.x 中已经被弃用了。
好比:Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in \includes\cls_template.php on line 300
原有内容:
return preg_replace("/{([^\}\{]*)}/e", "\$this->select('\\1');", $source);
修改后内容:
return preg_replace_callback("/{([^\}\{]*)}/", function($r) { return $this->select($r[1]); }, $source);
(2)Parse error: syntax error, unexpected 'endforeach' (T_ENDFOREACH) in /var/www/html/ecshop/temp/compiled/vote.lbi.php on line 13
修改后的vote.lbi.php为:
<?php if ($this->_var['vote']): ?><?php echo $this->smarty_insert_scripts(array('files'=>'transport.js')); ?>
<html>
<head>
<meta name="generator"
content="HTML Tidy for HTML5 (experimental) for Windows https://github.com/w3c/tidy-html5/tree/c63cc39" />
<title></title>
</head>
<body>
<div id="ECS_VOTE">
<div class="box">
<div class="box_1">
<h3>
<span>
<?php echo $this->_var['lang']['online_vote']; ?>
</span>
</h3>
<div class="boxCenterList">
<form id="formvote" name="ECS_VOTEFORM" method="post" action="javascript:submit_vote()">
<?php $_from = $this->_var['vote']; if (!is_array($_from) && !is_object($_from)) {
settype($_from, 'array');
}; $this->push_vars('', 'title');if (count($_from)):
foreach ($_from AS $this->_var['title']):
?><?php echo $this->_var['title']['vote_name']; ?>
<br />(<?php echo $this->_var['lang']['vote_times']; ?>:<?php echo $this->_var['title']['vote_count']; ?>)
<br /><?php endforeach; endif; unset($_from); ?><?php $this->pop_vars();; ?>
<?php $_from = $this->_var['vote']; if (!is_array($_from) && !is_object($_from)) {
settype($_from, 'array');
}; $this->push_vars('', 'title');if (count($_from)):
foreach ($_from AS $this->_var['title']):
?> <?php $_from = $this->_var['title']['options']; if (!is_array($_from) && !is_object($_from)) {
settype($_from, 'array');
}; $this->push_vars('', 'item_0_30844800_1297167693');if (count($_from)):
foreach ($_from AS $this->_var['item_0_30844800_1297167693']):
?> <?php if ($this->_var['title']['can_multi'] == 0): ?>
<input type="checkbox" name="option_id"
value="<?php echo $this->_var['item_0_30844800_1297167693']['option_id']; ?>" />
<?php echo $this->_var['item_0_30844800_1297167693']['option_name']; ?>
(<?php echo $this->_var['item_0_30844800_1297167693']['percent']; ?>%)
<br /><?php else: ?>
<input type="radio" name="option_id"
value="<?php echo $this->_var['item_0_30844800_1297167693']['option_id']; ?>" />
<?php echo $this->_var['item_0_30844800_1297167693']['option_name']; ?>
(<?php echo $this->_var['item_0_30844800_1297167693']['percent']; ?>%)
<br /><?php endif; ?> <?php endforeach; endif; unset($_from); ?><?php $this->pop_vars();; ?>
<input type="hidden" name="type" value="<?php echo $this->_var['title']['can_multi']; ?>" />
<?php endforeach; endif; unset($_from); ?><?php $this->pop_vars();; ?>
<input type="hidden" name="id" value="<?php echo $this->_var['vote_id']; ?>" />
<input type="submit" name="submit" style="border:none;"
value="<?php echo $this->_var['lang']['submit']; ?>" class="bnt_bonus" />
<input type="reset" style="border:none;" value="<?php echo $this->_var['lang']['reset']; ?>"
class="bnt_blue" /></form>
</div>
</div>
</div>
</div>
<div class="blank5"></div>
<script type="text/javascript">
/**
* 处理用户的投票
*/
function submit_vote()
{
var frm = document.forms[&amp;#39;ECS_VOTEFORM&amp;#39;];
var type = frm.elements[&amp;#39;type&amp;#39;].value;
var vote_id = frm.elements[&amp;#39;id&amp;#39;].value;
var option_id = 0;
if (frm.elements[&amp;#39;option_id&amp;#39;].checked)
{
option_id = frm.elements[&amp;#39;option_id&amp;#39;].value;
}
else
{
for (i=0; i&amp;lt;frm.elements[&amp;#39;option_id&amp;#39;].length; i++ )
{
if (frm.elements[&amp;#39;option_id&amp;#39;][i].checked){
option_id = (type == 0) ? option_id + &amp;quot;,&amp;quot; +
frm.elements[&amp;#39;option_id&amp;#39;][i].value :
frm.elements[&amp;#39;option_id&amp;#39;][i].value;
}
}
}
if (option_id == 0)
{
return;
}
else
{
Ajax.call(&amp;#39;vote.php&amp;#39;, &amp;#39;vote=&amp;#39; + vote_id +
&amp;#39;&amp;amp;options=&amp;#39; + option_id +
&amp;quot;&amp;amp;type=&amp;quot; + type,
voteResponse, &amp;#39;POST&amp;#39;, &amp;#39;JSON&amp;#39;);
}
}
/**
* 处理投票的反馈信息
*/
function voteResponse(result)
{
if (result.message.length &amp;gt; 0)
{
alert(result.message);
}
if (result.error == 0)
{
var layer = document.getElementById(&amp;#39;ECS_VOTE&amp;#39;);
if (layer)
{
layer.innerHTML = result.content;
}
}
}
</script> <?php endif; ?></body>
</html>
(3)Warning: file_put_contents(/var/www/html/ecshop/temp/compiled/vote.lbi.php): failed to open stream: Permission denied in /var/www/html/ecshop/includes/cls_template.php on line 262
Notice: can't write:/home/username/public_html/temp/compiled/page_header.lbi.php in /home/username/public_html/includes/cls_template.php on line 264
解決方法:修改tmep的权限sudo chmod 777 temp
(4)Strict Standards: Non-static method cls_image::gd_version() should not be called statically in ...install\includes\lib_installer.php on line 31
解決方法:将cls_image.php文件的gd_version方法改为静态方法,即static function。
3、安装Jmeter
一、下载安装 apache-jmeter-3.0
https://archive.apache.org/dist/jmeter/binaries/ 下载apache-jmeter-3.0.zip,解压到 D:\document\apache-jmeter-3.0,添加系统变量JMETER_HOME,设置值为 D:\document\apache-jmeter-3.0,打开 D:\document\apache-jmeter-3.0\bin 下的jmeter.bat,出现下面两个窗口:
二、使用Jmeter对性能测试脚本进行录制和回放
录制:添加线程组
回放:右键线程组 添加监听器aggregate report 和 view result tree,点击运行(绿色三角形)按钮:
Aggregate Report 10个字段,含义分别以下:
Label:每一个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,这里显示的就是 Name 属性的值
#Samples:表示你此次测试中一共发出了多少个请求,若是模拟10个用户,每一个用户迭代10次,那么这里显示100
Average:平均响应时间——默认状况下是单个 Request 的平均响应时间,当使用了 Transaction Controller 时,也能够以Transaction 为单位显示平均响应时间
Median:中位数,也就是 50% 用户的响应时间
90% Line:90% 用户的响应时间
Note:关于 50% 和 90% 并发用户数的含义,请参考下文:http://www.cnblogs.com/jackei/archive/2006/11/11/557972.html
Min:最小响应时间
Max:最大响应时间
Error%:本次测试中出现错误的请求的数量/请求的总数
Throughput:吞吐量——默认状况下表示每秒完成的请求数(Request per Second),当使用了 Transaction Controller 时,也能够表示相似 LoadRunner 的 Transaction per Second 数
KB/Sec:每秒从服务器端接收到的数据量,至关于LoadRunner中的Throughput/Sec
PS1:在代理服务器启动后,要打开浏览器的代理设置
PS2:打开代理后好比访问百度首页,会显示 您的链接不安全,说明JMeter数字证书是不被信任的,接下来咱们就须要将该证书导入到浏览器的根证书列表中以达到人工配置信任的目的。浏览器设置里 管理证书:
三、被测脚本参数化
四、用PostProcesser获取响应中的关键数据
使用CSS/JQuery Extractor获取响应数据
五、用BeanShellAssersion判断响应是否正确
4、Top命令
top命令 参考http://www.javashuo.com/article/p-fqgnidpj-bu.html
其中,
PID:进程ID,进程的惟一标识符
USER:进程全部者的实际用户名。
PR:进程的调度优先级。这个字段的一些值是'rt'。这意味这这些进程运行在实时态。
NI:进程的nice值(优先级)。越小的值意味着越高的优先级。负值表示高优先级,正值表示低优先级
VIRT:进程使用的虚拟内存。进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES:驻留内存大小。驻留内存是任务使用的非交换物理内存大小。进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR:SHR是进程使用的共享内存。共享内存大小,单位kb
S:这个是进程的状态。它有如下不一样的值:
%CPU:自从上一次更新时到如今任务所使用的CPU时间百分比。
%MEM:进程使用的可用物理内存百分比。
TIME+:任务启动后到如今所使用的所有CPU时间,精确到百分之一秒。
COMMAND:运行进程所使用的命令。进程名称(命令名/命令行)
5、安装sysstat并使用sysstat查看Linux服务器的CIMN的性能
$sudo apt-get install sysstat
sar命令介绍:摘自 https://blog.csdn.net/hguisu/article/details/7493661
sar命令能够从文件的读写状况、系统调用的使用状况、磁盘I/O、CPU效率、内存使用情况、进程活动及IPC有关的活动等方面进行报告。
命令格式:sar [options] [-A] [-o file] t [n]
t为采样间隔,n为采样次数,默认值是1
-o file表示将命令结果以二进制格式存放在文件中,file 是文件名。
options 为命令行选项
-A:全部报告的总和
-u:输出总体CPU使用状况的统计信息
-v:输出inode、文件和其余内核表的统计信息
-d:输出每个块设备的活动信息
-r:输出内存和交换空间的统计信息
-b:显示I/O和传送速率的统计信息
-a:文件读写状况
-c:输出进程统计信息,每秒建立的进程数
-R:输出内存页面的统计信息
-y:终端设备活动状况
-w:输出系统交换活动信息
一、CPU监控
总体CPU使用统计:sar -u -o test_sar 1 1
输出项说明:
CPU:all表示统计信息为全部 CPU的平均值。
%user:显示在用户级别(application)运行使用 CPU 总时间的百分比。
%nice:显示在用户级别,用于nice操做,所占用 CPU总时间的百分比。
%system:在核心级别(kernel)运行所使用 CPU总时间的百分比。
%iowait:显示用于等待I/O操做占用 CPU总时间的百分比。
%steal:管理程序(hypervisor)为另外一个虚拟进程提供服务而等待虚拟 CPU 的百分比。
%idle:显示 CPU空闲时间占用 CPU总时间的百分比。
PS:
1.若 %iowait的值太高,表示硬盘存在I/O瓶颈
2.若 %idle的值高但系统响应慢时,有多是 CPU等待分配内存,此时应加大内存容量
3.若 %idle的值持续低于1,则系统的 CPU处理能力相对较低,代表系统中最须要解决的资源是 CPU
因为test_sar是二进制文件中的内容, 当你用cat看test_sar时发现全都是乱码,别着急,sar为你准备了-f filename选项,你只要用 -f 设定要读取的信息存储文件,就能够清晰地读出信息了。
好比sar -f test_sar。
若是个人CPU是多核处理器,那么sar能知道某一个核的运行信息么?
彻底没问题的。有一个选项-P,就是用来为多核处理器而设计的。
当在使用sar命令而没有设定-P选项时,sar会根据全部核给出一个宏观汇报,也就是平均的值。
若是使用了-P选项来指定某一个核,那么就会针对这个单独的核给出具体性能信息。
当使用-P ALL时,sar就会根据每个核都给出其具体性能信息,而后再给出一个总的性能信息。
监控进程队列长度和平均负载状态:sar -q 1 1
输出项说明:
runq-sz:运行队列的长度(等待运行的进程数)
plist-sz:进程列表中进程(processes)和线程(threads)的数量
ldavg-1:最后1分钟的系统平均负载(System load average)
ldavg-5:过去5分钟的系统平均负载
ldavg-15:过去15分钟的系统平均负载
二、内存和交换空间监控
sar -r 1 2
输出项说明:
kbmemfree:这个值和free命令中的free值基本一致,因此它不包括buffer和cache的空间.
kbmemused:这个值和free命令中的used值基本一致,因此它包括buffer和cache的空间.
%memused:这个值是kbmemused和内存总量(不包括swap)的一个百分比.
kbbuffers和kbcached:这两个值就是free命令中的buffer和cache.
kbcommit:保证当前系统所须要的内存,即为了确保不溢出而须要的内存(RAM+swap).
%commit:这个值是kbcommit与内存总量(包括swap)的一个百分比.
监控内存分页:sar -B 1 2
输出项说明:
pgpgin/s:表示每秒从磁盘或SWAP置换到内存的字节数(KB)
pgpgout/s:表示每秒从内存置换到磁盘或SWAP的字节数(KB)
fault/s:每秒钟系统产生的缺页数,即主缺页与次缺页之和(major + minor)
majflt/s:每秒钟产生的主缺页数.
pgfree/s:每秒被放入空闲队列中的页个数
pgscank/s:每秒被kswapd扫描的页个数
pgscand/s:每秒直接被扫描的页个数
pgsteal/s:每秒钟从cache中被清除来知足内存须要的页个数
%vmeff:每秒清除的页(pgsteal)占总扫描页(pgscank+pgscand)的百分比
监控系统交换活动信息:sar -W 1 2
输出项说明:
pswpin/s:每秒系统换入的交换页面(swap page)数量
pswpout/s:每秒系统换出的交换页面(swap page)数量
三、I/O和传送速率监控
缓冲区的使用状况:sar -b 1 2
输出项说明:
tps:每秒钟物理设备的 I/O 传输总量
rtps:每秒钟从物理设备读入的数据总量
wtps:每秒钟向物理设备写入的数据总量
bread/s:每秒钟从物理设备读入的数据量,单位为 块/s
bwrtn/s:每秒钟向物理设备写入的数据量,单位为 块/s
设备使用状况:sar -d 1 2
其中:
参数-p能够打印出sda,hdc等磁盘设备名称,若是不用参数-p,设备节点则有多是dev8-0,dev22-0
tps:每秒从物理磁盘I/O的次数.多个逻辑请求会被合并为一个I/O磁盘请求,一次传输的大小是不肯定的.
rd_sec/s:每秒读扇区的次数.
wr_sec/s:每秒写扇区的次数.
avgrq-sz:平均每次设备I/O操做的数据大小(扇区).
avgqu-sz:磁盘请求队列的平均长度.
await:从请求磁盘操做到系统完成处理,每次请求的平均消耗时间,包括请求队列等待时间,单位是毫秒
svctm:系统处理每次请求的平均时间,不包括在请求队列中消耗的时间.
%util:I/O请求占CPU的百分比,比率越大,说明越饱和.
PS:
1. avgqu-sz 的值较低时,设备的利用率较高。
2. 当%util的值接近 100% 时,表示设备带宽已经占满。
四、Network监控
sar -n DEV 1 2
运行Jmeter测试以后的Aggregate Report 截图:
sudo gedit /etc/default/sysstat, 将 ENABLED=“false“ 改成ENABLED=“true“
sudo /etc/init.d/sysstat restart
sysstat 监控服务器性能截图:
5*10:由上至下分别为:cpu,memory,IO,网络,内存分页监控,设备使用状况。 命令为 sar -u ,sar -q;sar -r;sar -b;sar -n DEV;sar -B;sar-d。.
内存分页监控