摘要: 以下是一个Java爬虫程序,它能从指定主页开始,按照指定的深度抓取该站点域名下的网页并维护简单索引。 参数:private static int webDepth = 2;//爬虫深度。 主页的深度为1,设置深度后超过该深度的网页不会抓取。 private int intThreadNum = 10;//线程数。开启的线程数。 抓取时也会在程序...
阅读全文
SequoiaDB数据库的主要对象包括文档、集合、集合空间与索引等。 文档
SequoiaDB中的文档为JSON格式,一般又被称为记录。在数据库内部使用BSON,即二进制的方式存放JSON数据。一般情况下,一条文档由一个 或多处字段构成,每个字段分为键值与数值两个部分。需要指出的是:BSON文档可能有多个同名字段,但是,大多数SequoiaDB接口不支持重复的字段 名;SequoiaDB内部程序创建的一些文档可能含有重名的字段,但是不会向现有的用户文档添加重名的键。 集合
集合(Collection)是SequoiaDB数据库中存放文档的逻辑对象。任何一条文档必须属于一个且仅一个集合。 集合空间
集合空间(Collection Space)是数据库中存放集合的物理对象。任何一个集合必须属于一个且仅一个集合空间。每一个集合空间在数据节点均对应一个文件。 数据库服务器
SequoiaDB是文档型号非关系型数据库服务器,数据库服务器提供软件服务以便安全、高效地管理信息。数据库服务器是指安装了SequoiaDB数据 库引擎的计算机。SequoiaDB引擎为数据存取操作的基本单元,在分布式架构中,每个数据库作为一外节点存在,节点之间的数据无共享。在一台计算机 中,每一个SequoiaDB数据库引擎对应一个数据库路径,该数据库中所有的集合空间均放置在该目录中。数据库路径包含一个或多个集合空间。每个数据库 引擎可以包含最多4096个集合空间。 索引
在SequoiaDB数据库中,索引是一咱特殊的数据对象。索引本身不做为保存用户数据的容器。而是作为一种特殊的元数据,提高数据访问的效率。每一个索 引必须建立在一个集合中,一个集合最多可以拥有64个索引。索引可以被认为是将数据按照某个或多上给定的字段进行排序,从而在其中快速搜索到用户指定查询 条件的方式。在SequoiaDB中,索引使用B树结构。 事务 事务是一系列操作组成的逻辑工作单元。在同一个会话在(或连接)中,同一时刻只允许存在一个事务,也就是说当用户在一次会话中创建了一个事务,在这个事务 结束前用户不能再创建新的事务。事务作为一个完整的工作单元执行,事务中的操作要么全部执行成功要么全部执行失败。SequoiaDB事务中的操作只能是 插入数据、修改数据和删除数据,在事务过程中执行的其它操作不会纳入事务范畴,也就是说事务回滚时非事务操作不会被执行回滚。如果一个表或表空间中有数据 涉及事务操作,则该表或表空间不允许被删除。默认情况下,事务功能是关闭的。 最终一致性策略
SequoiaDB为了提升数据的可靠性和实现数据的读写分离,对于复制组间的数据采用“最终一致性”策略,在读写分离时读取的数据某一个时期内可能不是最新的,但最终是一致的。 读写分离
SequoiaDB中,所有写请求都只会发往节点,如果没有主节点则当前数据组不可处理写请求。 集群
SequoiaDB集群是指通过并联合多台数据库服务器,达到并行计算,以提升数据请求效率的方式。通过SequoiaDB集群,可以高性能的数据访问,保障数据高可用性,达到数据库的水平扩张能力。
运行模式
是指启动SequoiaDB服务时,该服务以独立模式启动还是以集群模式启动。独立模式是启动SequoiaDB的最精简模式,仅需要启动一个独立模式的 数据节点,即可进行数据服务。(一般推荐在开发环境中使用独立模式,以减少对硬件资源的需求。)集群模式是启动SequoiaDB的标准模式,至少需要三 个节点。 节点
编目节点:是一种逻辑节点,其中保存了数据库的元数据信息,而不保存其他用户数据。除了编目节点外,集群中所有其他的节点不在磁盘中保存任何全局元数据信 息。当需要访问其他节点上的数据时,除编目节点外的其他节点需要从本地缓存中寻找集合信息,如果不存在则需要从编目节点获取。编目节点与其它节点之间主要 使用编目服务端口进行通讯。 协调节点:也是一种逻辑节点,基中并不保存任何用户数据信息。协调节点作为数据请求部分的协调者,本身并不参与数据的匹配与读写操作,而仅仅是将请求分发到所需要处理的数据节点为。协调节点与其它节点之间主要使用分区服务端口进行通讯。 数据节点:仍是一种逻辑节点,其中保存用户数据信息。数据节点中高有专门的编目信息集合,因此第一次访问集合前需要向编目节点请求该集合的元数据信息。在独立模式中,数据节点为单独的服务提供者,直接与应用程序或客户端进行通讯,并且不需要访问任何编目信息。 分区组
又被称为复制组,一个复制组内可以包含一个或多个数据节点(或编目节点),节点之间的数据使用异步日志复制机制,保持最终一致。分区组中所有的节点之间使 用复制服务端口进行通讯,定期相互发送心跳信息以相互验证状态。每个分区组的节点有两种状态:主节点(可作读写操作,所有写入的数据会同步写入日志文件, 日志文件中的日志信息会异步写入从节点)和从节点(作只读操作,所有从主节点写入的数据会异步写入从节点,因此从节点与主节点之间可能存在暂时的数据不一 致,但是复制机制可以保证数据的最终一致性)。 数据分区 在SequoiaDB集群环境中,用户往往将数据存放在不同的逻辑节点与物理节点中,以达到交行计算目的。由于每一个存放数据的分区组中所有节点包含的数据完全相同,每个分区组被称作一个“分区”每个分区之间的数据互不影响,无共享状态。 以上介绍了SequoiaDB数据库的一些基本概念,希望能对深入理解及高效使用SequoiaDB数据库有所帮助。
我也不多说直接贴代码package com.yf.pullxmlpare; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.xmlpull.v1.XmlPullParser; import android.util.Xml; //package com.yf.pullxmlpare.person; public class PersonService { public static List<person> getPersons(InputStream xml) throws Exception{ List<person> person1 = null; person ps=null; XmlPullParser PullParser = Xml.newPullParser(); PullParser.setInput(xml, "UTF-8"); int event = PullParser.getEventType(); while(XmlPullParser.END_DOCUMENT != event){ switch(event){ case XmlPullParser.START_DOCUMENT: person1 = new ArrayList<person>(); //做初始化 break; case XmlPullParser.START_TAG: //2 if("person".equals(PullParser.getName())){ int id = new Integer( PullParser.getAttributeValue(0)); ps = new person(); ps.setId(id); } if("name".equals(PullParser.getName())){ String s = PullParser.nextText(); ps.setName(s); } if("age".equals(PullParser.getName())){ int age = new Integer( PullParser.nextText()); ps.setAge(age); } break; case XmlPullParser.END_TAG: if("person".equals(PullParser.getName())){ person1.add(ps); ps = null; } break; case XmlPullParser.END_DOCUMENT: break; default: break; } event = PullParser.next(); //移动指针向后面的元素 } return person1; } } mainfest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.yf.pullxmlpare" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.yf.pullxmlpare.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <uses-library android:name="android.test.runner" /> </application> <instrumentation android:targetPackage="com.yf.pullxmlpare" android:name="android.test.InstrumentationTestRunner" android:label="Testfor my app" /> </manifest> |
单元测试代码package testxml; import java.io.InputStream; import java.util.List; import com.yf.pullxmlpare.PersonService; import com.yf.pullxmlpare.person; import android.test.AndroidTestCase; import android.util.Log; public class TestXML extends AndroidTestCase { private final String TAG = "TestXML"; public void testperson() throws Exception{ InputStream xml = this.getClass().getClassLoader().getResourceAsStream("person.xml"); List<person> ps1 = PersonService.getPersons(xml); for(person personx:ps1){ Log.i(TAG, personx.toString()); } } } |
第一次做
性能测试,按照操作文档磕磕碰碰的完成了,并且拿到了结果,看到一堆的指标和数据,还是傻眼了,不知道各个指标是什么意思了。
咨询了大牛和度娘,消化理解了一下,不知道是不是正确的。
CPU使用率:
一段时间内CPU的使用状况,从这个指标可以看出某一段时间内CPU资源被占用的情况。
Load Average:
某一段时间内,CPU正在处理以及等待CPU处理的进程数的之和。Load Average是从另一个角度来体现CPU的使用状态的。
CPU使用率和Load Average的关系:
拿去医院体检做一个例子:
用户:待检查的同学
CPU:检查的科室(B超、眼科。。。。)
1、 Load 高,CPU使用率低 :
眼科一共有3个医生,检查有次序,必须前一个医生检查结束了才能到下一个医生处理
由于第一个医生的检查耗时比较长,导致后面很多同学排队,但是接下去2个医生都处于空闲状态。
Load:等待的同学,由于等待的同学较多,所以Load的值较高
CPU使用率:只有一个医生处于
工作状态,所以CPU的使用率为33.33%
2、 Load低,CPU使用率高:
假设B超科室有和眼科同样多的医生,但是每个医生之间的工作是独立的。
来一个新同学的时间,大约是检查完一个同学的时间。
Load:等待的同学,基本<=1
CPU使用率:每个医生都处于忙碌状态,CPU使用率接近100%
由上面可以看到,不能单纯从一个方面来看性能的优劣。同样,性能调优也可以从多方面入手。
随着产品发布越来越快,渠道包越来越多,渠道包自动化验证重要性逐渐凸显出来,需要将大把的人力从中解放出来,且避免人工失误造成的验证不完全; 最近客户端产品尝试使用渠道包自动化测试的方法,这里说说我们目前的做法; 需求:验证渠道包的 渠道号、使用到的URL地址,以及简单冒烟; 一、验证渠道号
三个方法,根据产品自身的情况而定; 1. 通过反编译apk包获得 渠道号 说明:apk的 res/xml下存放渠道号信息,如存放在 channel.xml文件里 (1)使用apktool工具,反编译apk,从 channel.xml中取出 该包的渠道号; (2)从apk文件名称截取出渠道号; 两两进行对比; 2. 从logcat获取渠道号信息 说明:客户端启动时,打印渠道号信息 (1)启动客户端,从logcat日志中,截取出渠道号; (2)从apk文件名截取出渠道号; 两两进行对比; 具体渠道号信息如何存放,可以同项目组进行讨论商定。 3.(1)编写单元测试用例(可以用athrun框架),读取出渠道号;启动客户端,通过命令执行该测试用例,即可获得渠道号 (2)从apk文件名截取出渠道号;两两进行对比; 二、URL地址验证 两个方法,类似签名的渠道号验证:通过反编译获得URL,或者通过启动客户端时,截取logcat日志获得; 当然事先要准备期望的URL地址列表; 验证URL的目的,是因为,发布apk使用的现网地址与测试环境地址是不同的,要确保打出的各渠道包的URL地址使用是否正确。 三、简单冒烟
目的:验证各渠道包基本功能是否可用,根据实际情况写脚本; 下面介绍2个方法: 1. 使用monkeyrunner验证简单功能; 2. 通过athrun编写的测试用例执行,但该方法不一定对所有产品试用,如果渠道包的代码经过混淆,那么无法使用; 其实如果项目组里的自动化做得比较好的话,这里的冒烟脚本可以直接使用日常使用的冒烟脚本
说起项目流程更多的让人第一感觉是严肃,枯燥,冗长,根据参加过的项目经验和其他的一些情况来说说项目流程这个事?
1.项目需不需要流程?
答案是肯定的。首先项目肯定是有目标,有计划的,所以可以说要做的事情,要完成的时间是具体的,其次项目肯定是多人协作的,即使是一个人做的项目,在不同的阶段所做的
工作也是不一样的。既然多人协作,就需要分工,分工就需要确定谁在什么时候做什么事,所以流程就应运而生。
流程是因为协作和分工而产生的结果,所以肯定是必须的。
而且从以往的经验来看,很多项目在发生了严重的线上故障以后再回头来梳理流程,规范流程。所以有流程的保障,项目质量更有保障,可以防范于未然。
2.如何制定合适的流程?
既然流程是必须的,那么如何制定一个适合的项目流程呢?我认为需要考虑的有以下几个因素:
(1)角色 :整个项目过程中会有多少种角色参与?
(2)时间:项目会有多少个阶段,例如一般的项目有:立项,需求,设计,编码,
测试,发布等阶段
(3)分工:不同阶段里面每个角色的分工是什么?
(4)产出:每个阶段不同角色的产出是什么?
(5)里程碑:里程碑是标志着一个阶段的结束,或者另一个阶段的开始的事件完成产出。
把以上五个因素考虑清楚之后,确定好以后基本上一个项目的流程就已经比较明晰了,再考虑两个原则:
(1)原则性:流程中哪些是必须产出的,这个一定要有,失去原则性,流程就失去了约束力。
(2)灵活性:流程中哪些是可以舍的,这个也要有,失去灵活性,流程在执行的过程中会困难重重。
3.如何执行流程?
这也是最难的一部分,很多项目都是有流程的,但是无人遵守,所以以下几点可以帮助更好的执行流程:
(1)约定流程:立项时就明确的和项目中的每个成员,每个角色约定好流程。
(2)坚持原则:对于流程中原则性的部分一定要坚守。
(3)适当灵活:对于灵活性的部分可以根据项目进展的情况适当灵活处理。
4.推荐的流程
这里推荐一下我们团队的流程,该流程由诗若(华丹萍)同学起草的,全团队成员经过两次评审通过的:
1、下载安装Myeclipse或者eclipse
2、安装完成后,查看Myeclipse最新的tomcat版本,查询方法为,点击Windows--Preference--Myeclipse--server--tomcat
如
3、到http://tomcat.apache.org/download-60.cgi tomcat官网下载对应的最新版本,现在的最新版本为8,此处我们下载的是7
4、下载完成后,进入上图中的服务器位置,点击home directory后面的browse选择解压缩后的tomcat位置,如我的解压缩后的目录为:G:\apache-tomcat-7.0.42-windows-x64\apache-tomcat-7.0.42,选择好以后,下面的2个自动会加入。
5、保存
7、run as Myeclipse
server application
8、访问http://localhost:8080确保服务器
工作正常
9、访问http://localhost:8080/MyProject(工程名)访问工程默认主页
挂载光驱 mount -t iso9660 /dev/cdrom /mnt/cdrom
卸载光驱 umount /dev/cdrom
弹出光驱 eject
推进光驱 eject –t
mysql-server-3.23.54a-11.i386.rpm
mysql-3.23.54a-11.i386.rpm
开发MySQL需要特别安装开发包:
mysql-devel-3.23.54a-11.i386.rpm
三、Linux程序包的安装:
rpm –ivh 要安装的软件包
rpm –qa | grep 特定的软件包
rpm –e 要删除的软件包
四、Linux中Mysql服务的启动:
/etc/rc.d/init.d/mysqld status 查看当前的mysql服务状态
service mysqld start 启动mysql服务
mysql –u root –p pass 使用用户名root和密码pass连接mysql数据库
五、Linux C/C++开发MySQL程序结构
头文件:#include
编译选项:
gcc -o
server server.c –I /usr/include/mysql –L /usr/lib/mysql –l mysqlclient –lz –lm
连接过程:
建立MYSQL mysql;
mysql_init(&mysql);初始化
mysql_real_connect(&mysql,“hostname”,“username”,“password”,“database”,0,NULL,0);
mysql_real_query(&mysql,SQL);
Step 3:获取查询结果
建立MYSQL_RES结构 *res;
res = mysql_store_result(&mysql);
Step 4:获取查询结果每一行,并进行相应处理
mysql_fetch_row(res);
mysql_num_fields(res); 获取结果的字段数
printf(“%s\n”,row[index]);
Step 5:释放资源
mysql_free_result(res);
mysql_close(&mysql);
问题:
1.new Date() 得到的时间?和系统相差 相差8个小时
2.eclipse控制台打印的时间与系统相差 相差8个小时
3.log4j日志的时间与与系统相差 相差8个小时
上述问题其实是同一个问题。
解决方法如下:
1.在代码前加上下面这句话就行了:TimeZone tz =TimeZone.getTimeZone("Asia/Shanghai");TimeZone.setDefault(tz)
2.在tomcat中修改catalina.bat文件的 set JAVA_OPTS在后面加上-Duser.timezone=GMT+08
3.修改注册表中的默认时区改成(GMT+08:00) 北京,重庆,香港特别行政区,乌鲁木齐
如果还不行看下:从正常的并且是相同系统的机器中导出HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Time Zones 项,然后导入到自己机器中 。
以上三种方法都是解决方法。
在修改时区的时候最好用代码看下JAVA获得的时区是什么时区,代码如下:
Properties props=System.getProperties(); Iteratoriter=props.keySet().iterator(); while(iter.hasNext())??Stringkey=(String)iter.next(); System.out.println(key+" = "+props.get(key)); } |
user.timezone=??就是JAVA获得的时区,然后再看
操作系统的时区。去改注册表吧。
weblogic :
有一个页面需要保存日期,在前台JS中DEBUG的时候都是正确的,可是存到
数据库中,就发现日期少一天,准确的说是比选择的日期早了8个小时,基本就可以确定是时区的错误,
开始查找,数据库时区,没问题,服务器系统时区,没问题,
最终问题居然出在weblogic的时区上面...
weblogic是使用自带的jre,而自带的jre中默认的时区就是GMT,而中国标准时间大家都知道是GMT+8,网上有说去改weblogic自带jre中的GMT文件,把GMT8改成GMT,但总觉得这样不是很好,如果有需要使用GMT标准时间的时候会有出问题的风险
于是从weblogic的启动脚本上下手
修改 domians/project/bin/startWebLogic.cmd
找到类似
Xml代码
set JAVA_OPTIONS=%JAVA_OPTIONS%
[xml] view plaincopy
set JAVA_OPTIONS=%JAVA_OPTIONS%
在最后面加上 -Duser.timezone=GMT+8 即设置时区为GMT+8 也可写为 Asia/shanghai
修改之后为
Xml代码
set JAVA_OPTIONS=%JAVA_OPTIONS% -Duser.timezone=GMT+8
[xml] view plaincopy
set JAVA_OPTIONS=%JAVA_OPTIONS% -Duser.timezone=GMT+8
保存,重新启动weblogic,问题解决
文件查找:startWebLogic.cmd
find / -name mk/表示查找目录,也可以具体到某个目录以提高效率-name表示以文件名查找
设置默认时区:
TimeZone tz =TimeZone.getTimeZone("Asia/Shanghai");
TimeZone.setDefault(tz);
Date date=new Date();
String str=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
System.out.println(str);
设置时间格式的时区:
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd kk:mm:ss ");
sdf.setTimeZone(TimeZone.getTimeZone("GMT+8"));
Date d = new Date();
System.out.println(sdf.format(d));
设置日历的时区:
Calendar now = Calendar.getInstance(); now.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));//important System.out.println(now.get(Calendar.YEAR)); System.out.println(now.get(Calendar.MONTH)); System.out.println(now.get(Calendar.DAY_OF_MONTH)); System.out.println(now.get(Calendar.HOUR_OF_DAY)); |
设置时间格式的时区:
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA); formatter.setTimeZone(TimeZone.getTimeZone("GMT+8")); Date currTime = new Date(); String thisTime = new String(formatter.format(currTime)); System.out.println("GMT+8:"+thisTime); |
系统时区:
String tzId = TimeZone.getDefault().getID();
System.out.println("TimeZone.getDefault().getID():"+tzId);
系统时区:
String zone = System.getProperty("user.timezone");
System.out.println("user.timezone:"+zone);
1. sysbench 介绍
sysbench是一个模块化的、跨平台、多线程基准
测试工具,主要用于评估测试各种不同系统参数 下的
数据库负载情况。关于这个项目的详细介绍请看:http://sysbench.sourceforge.net。
它主要包括以下几种方式的测试:
cpu性能
磁盘io性能
调度程序性能
内存分配及传输速度
POSIX线程性能
数据库性能(OLTP基准测试)
2. 安装sysbench
sudo apt-get install sysbench
也可以下载源码,然后自己编译安装。
项目主页:http://sysbench.sourceforge.net/
下载地址:http://sourceforge.net/projects/sysbench
文档地址:http://sysbench.sourceforge.net/docs
3. 开始测试
3.1 CPU性能测试
根据官网的介绍可知:CPU测试使用64位整数,测试计算素数直到某个最大值所需要的时间。
sysbench --test=cpu --cpu-max-prime=20000 run
输出如下:
Maximum prime number checked in CPU test: 200000 Test execution summary: total time: 286.5703s total number of events: 10000 total time taken by event execution: 285197.4463 per-request statistics: min: 109.67ms avg: 28519.74ms max: 36760.02ms approx. 95 percentile: 31751.56ms Threads fairness: events (avg/stddev): 9.7656/0.81 execution time (avg/stddev): 278.5131/6.05 |
我们只需要关心测试的总时间(total time)即可。
CPU性能测试有一个需要注意的地方,上面的测试只使用了一个线程,如果在两个cpu processor不同的电脑上做比较,这是不公平的。公平的做法是指定合理的线程数,如下所示:
sysbench --test=cpu --num-threads=`grep "processor" /proc/cpuinfo | wc -l` \
--cpu-max-prime=200000 run
补充知识:
查看CPU核数的方法
查看物理cpu个数
grep "physical id" /proc/cpuinfo | sort -u | wc -l
查看核心数量
grep "core id" /proc/cpuinfo | sort -u | wc -l
查看线程数量
grep "processor" /proc/cpuinfo | sort -u | wc -l
在sysbench的测试中,--num-threads取值为"线程数量"即可,再大的值没有什么意义,对测试结果也没有什么影响。
3.2 线程(thread)测试
测试线程调度器的性能。对于高负载情况下测试线程调度器的行为非常有用。
sysbench --test=threads --num-threads=64 run
下面是输出结果:
Number of threads: 64 Doing thread subsystem performance test Thread yields per test: 1000 Locks used: 8 Threads started! Done. Test execution summary: total time: 4.5845s total number of events: 10000 total time taken by event execution: 291.9995 per-request statistics: min: 0.76ms avg: 29.20ms max: 152.71ms approx. 95 percentile: 71.11ms Threads fairness: events (avg/stddev): 156.2500/5.81 execution time (avg/stddev): 4.5625/0.02 |
说实话,我也不怎么会分析这个测试结果,网上搜了半天也没有搜到,几乎所有的资料都是简单的罗列出测试结果, 也不告诉我们应该怎么分析,实在是太不照顾新手了。 我自己是通过(total time:)判断线程调度的性能的,下面是我在服务器上运行这个测试的输出:
Number of threads: 64 Doing thread subsystem performance test Thread yields per test: 1000 Locks used: 8 Threads started! Done. Test execution summary: total time: 2.4829s total number of events: 10000 total time taken by event execution: 157.3468 per-request statistics: min: 0.21ms avg: 15.73ms max: 166.69ms approx. 95 percentile: 119.14ms Threads fairness: events (avg/stddev): 156.2500/22.25 execution time (avg/stddev): 2.4585/0.02 |
可以看到total time 比在我自己电脑上少了一半,服务器的线程调度肯定比普通电脑快多了。
3.3 互斥锁(mutex)
测试互斥锁的性能,方式是模拟所有线程在同一时刻并发运行,并都短暂请求互斥锁。
sysbench --test=mutex --num-threads=16 --mutex-num=2048 \
--mutex-locks=1000000 --mutex-loops=5000 run
输出结果如下:
Number of threads: 16 Doing mutex performance test Threads started! Done. Test execution summary: total time: 3.6123s total number of events: 16 total time taken by event execution: 57.6636 per-request statistics: min: 3580.79ms avg: 3603.98ms max: 3610.94ms approx. 95 percentile: 10000000.00ms Threads fairness: events (avg/stddev): 1.0000/0.00 execution time (avg/stddev): 3.6040/0.01 |
为了不误导别人,我就不解释各参数的含义了,可以请参考这里。
3.4 内存测试
内存测试测试了内存的连续读写性能。
sysbench --test=memory --memory-block-size=8K --memory-total-size=2G --num-threads=16 run
上面这条语句指定了整个测试过程中,传输2G的数据量,每个block的大小为8K(大写的K)。 测试结果如下所示,我们最关心的是吞吐量(8030.45MB/sec),和后面的磁盘io 测试结果比较可知,内存的连续读写比磁盘的连续读写快十几倍。
Number of threads: 16 Doing memory operations speed test Memory block size: 8K Memory transfer size: 2048M Memory operations type: write Memory scope type: global Threads started! Done. Operations performed: 262144 (1027897.89 ops/sec) 2048.00 MB transferred (8030.45 MB/sec) Test execution summary: total time: 0.2550s total number of events: 262144 total time taken by event execution: 3.1911 per-request statistics: min: 0.00ms avg: 0.01ms max: 29.55ms approx. 95 percentile: 0.00ms Threads fairness: events (avg/stddev): 16384.0000/926.14 execution time (avg/stddev): 0.1994/0.02 |
3.5 文件IO基准测试
文件IO(fileio)基准测试可以测试系统在不同IO负载下的性能。这对于比较不同的硬盘驱动器,不同的RAID 卡,不同的RAID 模式,都很有帮助。可以根据测试结果调整IO子系统。文件IO基准测试模拟了很多InnoDB 的IO特性。
测试的第一步是准备(Prepare)阶段,生成测试用到的数据文件,生成的数据文件至少要比内存大。 如果文件中的数据能完全放入内存中,则操作系统 缓存大部分的数据,导致测试结果无法体现IO密集型的工作负载。首先通过下面的命令创建一个数据集:
sysbench --test=fileio --file-total-size=40G prepare
这个命令会在当前工作目录下创建测试文件,后续的运行(run)阶段将通过读写这些文件进行测试。 第二步就是运行(run)阶段,针对不同的IO 类型有不同的测试选项:
seqwr 顺序写入
seqrewr 顺序重写
seqrd 顺序读取
rndrd 随机读取
rndwr 随机写入
rndrw 混合随机读/写
下面的命令运行文件I/O混合随机读/写基准测试:
sysbench --test=fileio --file-total-size=40G --file-test-mode=rndrw\
--init-rng=on --max-time=300 --max-requests=0 run
simple 与 --oltp-read-only 的区别
simple模式和在complex模式下开启read-only选项都只包含select语句。但是 simple 模式只包含最简单的select语句,相反地,complex 模式中,如果我们开启read-only 选项,即--oltp-read-only=on,则会包含复杂的SQL语句。如:
SELECT SUM(K) FROM sbtest WHERE id BETWEEN N and M
SELECT DISTINCT c FROM sbtest WHERE id BETWEEN N and M ORDER BY c
测试自有的存储引擎
测试自有的存储引擎需要告诉sysbench,这个存储引擎是否支持事务。
如下所示:
准备
sysbench --test=oltp --mysql-table-engine=tnt --mysql-engine-trx=yes \
--oltp-table-size=100000 --mysql-user=root --mysql-db=test \
--mysql-socket=/data/ntse/lmx/sysbench/var/mysqld.sock \
prepare
测试
sysbench --test=oltp --mysql-table-engine=tnt --mysql-engine-trx=yes \
--oltp-table-size=100000 --mysql-user=root --mysql-db=test \
--mysql-socket=/data/ntse/lmx/sysbench/var/mysqld.sock \
--oltp-test-mode=complex --num-threads=16 --max-time=720 \
--max-requests=0 run
清除
sysbench --test=oltp --mysql-table-engine=tnt --mysql-engine-trx=yes \
--oltp-table-size=100000 --mysql-user=root --mysql-db=test \
--mysql-socket=/data/ntse/lmx/sysbench/var/mysqld.sock \
clean
4. sysbench 0.5
4.1 下载安装
下载
bzr branch lp:sysbench
安装依赖库
sudo apt-get installlibtool
安装
tar -zxvf sysbench.tar.gz
cd sysbench
./autogen.sh
./configure
make
#make install #可选
开始测试
cd sysbench/sysbench ./sysbench --test=./tests/db/oltp.lua --debug=yes \ --mysql-host=localhost \ --mysql-socket=PATH/mysqld.sock \ --mysql-db=test \ --mysql-table-engine=innodb \ --mysql-engine-trx=yes \ --mysql-user=root \ --max-requests=0 \ --max-time=60 \ --num-threads=16 \ --oltp-table-size=100000 \ --report-interval=10 [prepare|run|cleanup] |
解释
--debug 参数用以打印更加详细的调试信息
--report-interval 用以打印中间结果
除了测试oltp,sysbench 0.5还可以进行插入操作的性能测试(insert.lua),选择操作的性能测试(select.lua)等。