qileilove

blog已经转移至github,大家请访问 http://qaseven.github.io/

多线程实现的Java爬虫程序

     摘要: 以下是一个Java爬虫程序,它能从指定主页开始,按照指定的深度抓取该站点域名下的网页并维护简单索引。  参数:private static int webDepth = 2;//爬虫深度。  主页的深度为1,设置深度后超过该深度的网页不会抓取。     private int intThreadNum = 10;//线程数。开启的线程数。  抓取时也会在程序...  阅读全文

posted @ 2013-10-10 10:53 顺其自然EVO 阅读(371) | 评论 (0)编辑 收藏

SequoiaDB数据库的一般概念介绍

 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数据库有所帮助。

posted @ 2013-10-10 10:45 顺其自然EVO 阅读(182) | 评论 (0)编辑 收藏

Android XML解析之PULL及单元测试

 我也不多说直接贴代码
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());
}
}
}

posted @ 2013-10-09 11:01 顺其自然EVO 阅读(295) | 评论 (0)编辑 收藏

性能测试指标的理解--cpu和load

 第一次做性能测试,按照操作文档磕磕碰碰的完成了,并且拿到了结果,看到一堆的指标和数据,还是傻眼了,不知道各个指标是什么意思了。
  咨询了大牛和度娘,消化理解了一下,不知道是不是正确的。
  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%
  由上面可以看到,不能单纯从一个方面来看性能的优劣。同样,性能调优也可以从多方面入手。

posted @ 2013-10-09 11:00 顺其自然EVO 阅读(382) | 评论 (0)编辑 收藏

Android渠道包自动化验证

 随着产品发布越来越快,渠道包越来越多,渠道包自动化验证重要性逐渐凸显出来,需要将大把的人力从中解放出来,且避免人工失误造成的验证不完全;
  最近客户端产品尝试使用渠道包自动化测试的方法,这里说说我们目前的做法;
  需求:验证渠道包的 渠道号、使用到的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编写的测试用例执行,但该方法不一定对所有产品试用,如果渠道包的代码经过混淆,那么无法使用;
  其实如果项目组里的自动化做得比较好的话,这里的冒烟脚本可以直接使用日常使用的冒烟脚本

posted @ 2013-10-09 10:58 顺其自然EVO 阅读(408) | 评论 (0)编辑 收藏

说说项目流程这个事

说起项目流程更多的让人第一感觉是严肃,枯燥,冗长,根据参加过的项目经验和其他的一些情况来说说项目流程这个事?
  1.项目需不需要流程?
  答案是肯定的。首先项目肯定是有目标,有计划的,所以可以说要做的事情,要完成的时间是具体的,其次项目肯定是多人协作的,即使是一个人做的项目,在不同的阶段所做的工作也是不一样的。既然多人协作,就需要分工,分工就需要确定谁在什么时候做什么事,所以流程就应运而生。
  流程是因为协作和分工而产生的结果,所以肯定是必须的。
  而且从以往的经验来看,很多项目在发生了严重的线上故障以后再回头来梳理流程,规范流程。所以有流程的保障,项目质量更有保障,可以防范于未然。
  2.如何制定合适的流程?
  既然流程是必须的,那么如何制定一个适合的项目流程呢?我认为需要考虑的有以下几个因素:
  (1)角色 :整个项目过程中会有多少种角色参与?
  (2)时间:项目会有多少个阶段,例如一般的项目有:立项,需求,设计,编码,测试,发布等阶段
  (3)分工:不同阶段里面每个角色的分工是什么?
  (4)产出:每个阶段不同角色的产出是什么?
  (5)里程碑:里程碑是标志着一个阶段的结束,或者另一个阶段的开始的事件完成产出。
  把以上五个因素考虑清楚之后,确定好以后基本上一个项目的流程就已经比较明晰了,再考虑两个原则:
  (1)原则性:流程中哪些是必须产出的,这个一定要有,失去原则性,流程就失去了约束力。
  (2)灵活性:流程中哪些是可以舍的,这个也要有,失去灵活性,流程在执行的过程中会困难重重。
  3.如何执行流程?
  这也是最难的一部分,很多项目都是有流程的,但是无人遵守,所以以下几点可以帮助更好的执行流程:
  (1)约定流程:立项时就明确的和项目中的每个成员,每个角色约定好流程。
  (2)坚持原则:对于流程中原则性的部分一定要坚守。
  (3)适当灵活:对于灵活性的部分可以根据项目进展的情况适当灵活处理。
  4.推荐的流程
  这里推荐一下我们团队的流程,该流程由诗若(华丹萍)同学起草的,全团队成员经过两次评审通过的:

posted @ 2013-10-09 10:57 顺其自然EVO 阅读(197) | 评论 (0)编辑 收藏

JAVA WEB入门级

 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、保存
  6、新建java web项目
  7、run as Myeclipse server application
  8、访问http://localhost:8080确保服务器工作正常
  9、访问http://localhost:8080/MyProject(工程名)访问工程默认主页

posted @ 2013-10-09 10:46 顺其自然EVO 阅读(274) | 评论 (0)编辑 收藏

Linux系统下C/C++开发mysql数据库应用

一、Linux下挂载光驱:
  挂载光驱 mount -t iso9660 /dev/cdrom /mnt/cdrom
  卸载光驱 umount /dev/cdrom
  弹出光驱 eject
  推进光驱 eject –t
  二、运行MySQL只需安装:
  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
  连接过程:
  Step 1:连接数据库
  建立MYSQL mysql;
  mysql_init(&mysql);初始化
  mysql_real_connect(&mysql,“hostname”,“username”,“password”,“database”,0,NULL,0);
  Step 2:执行SQL语句
  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);

posted @ 2013-10-09 10:45 顺其自然EVO 阅读(827) | 评论 (0)编辑 收藏

java 获得的系统时间与操作系统的时间不一致

问题:
  1.new Date() 得到的时间?和系统相差 相差8个小时
  2.eclipse控制台打印的时间与系统相差 相差8个小时
  3.log4j日志的时间与与系统相差 相差8个小时
  上述问题其实是同一个问题。
  原因:java获得的时区跟系统的时区不一样
  解决方法如下:
  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
  unix搜索命令:
  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);

posted @ 2013-10-09 10:43 顺其自然EVO 阅读(1118) | 评论 (0)编辑 收藏

sysbench 0.5 性能测试工具使用手册

 1. sysbench 介绍
  sysbench是一个模块化的、跨平台、多线程基准测试工具,主要用于评估测试各种不同系统参数 下的数据库负载情况。关于这个项目的详细介绍请看:http://sysbench.sourceforge.net。
  它主要包括以下几种方式的测试:
  cpu性能
  磁盘io性能
  调度程序性能
  内存分配及传输速度
  POSIX线程性能
  数据库性能(OLTP基准测试)
  目前sysbench主要支持MySQL,Pgsql和Oracle这3种数据库。
  2. 安装sysbench
  基于Debain的操作系统,可以直接安装:
  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)等。

posted @ 2013-10-08 11:39 顺其自然EVO 阅读(766) | 评论 (0)编辑 收藏

仅列出标题
共394页: First 上一页 198 199 200 201 202 203 204 205 206 下一页 Last 
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

常用链接

留言簿(55)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜