如何生成tomcat 每秒请求数量百万级别的 HTTP 请求

如何生成每秒百万级别的 http 请求_百度知道
如何生成每秒百万级别的 http 请求
提问者采纳
0 content 18;&#47。  我一开始用的是‘ab’;&gt!  在这个系列文章的剩余部分://&#47,000 个请求: min 59.168.14&  &/arrivalphase phase=&  &  &&#47,和一些你选择的分布式节点的 SSH 密钥;9&usr/sessions&gt.9 max 7912;1;/  &&#47: 1.gz  解压并且编译。与 Jmeter 不同的是;  &lt、登陆,000 个请求;request&;&gt.1&quot!这绝对是一个好的进展、多协议测试工具  它每秒基本可以产生 40,000 个 socket .168.168; weight=&localhost& &lt.10 --num-conn 100000 --ra 20000 --timeout 5  (总共创建了 100。但它不是我要用在这个项目里的重量级工具;/client& unit=&quot.txt& duration=&loadnode2&quot。但是基本上,在正确的配置下它可以每秒产生百万级的 HTTP 请求。  cp
&#47、WebDAV;  &40000& arrivalrate=&quot,‘ab’并不适合我们的基准测试,000 个的速率创建了 100;session probability=&&s (3;ip value=&&  &lt:你能在 Linux 上建立多少个 socket 连接;3&&#47,并且你甚至可以把这些图片展示给你的 boss 看;&gt。它的简洁和效率对我的吸引力;192;  &lt,000 个会话(session): 1xx=0 2xx=xx=0 4xx=0 5xx=0  CPU time [s],我使用这些设置达到了每秒 6;s]。它是我所知道的 http 基准测试工具中最简单;15000& weight=&quot。经过大量的尝试以及失败后.5 stddev 993;192.dtd&quot。  httperf --hog --server=192;client host=&quot。因此;  &8&quot:  httperf --hog --server 192;8&quot.2&quot!但这已经达到极限了;sessions&80&client host=&  &lt.168;loadnode4&/&#47,那么请建立之;&gt,Tsung 还可以在 html 上产生图表以及输入你的测试的详细报告;http url=&1&40000&quot.13&&gt,或者直接跳到下一页; arrivalrate=&  &  &lt.2&  &lt,所以还要寻找另一个工具;ts_http&  &&#47.4;  &8&quot。 除此之外;usr&#47.4 avg 1060;req)  Request size [B]?&gt。并且它是 Apache 附带的产品;i&quot。因此;server host=&ip value=&quot,我们还需要不止一台的机器来产生负载;& maxusers=&quot.0  Reply rate [replies/ var=&quot: 467;load&arrivalphase&tsung&#47.4;loadnode7&  &session&  &lt,000 个连接。经过我的多次尝试;&gt.4;users maxnumber=&  &  &  &lt.0& type=& port=&//client host=&quot!  根据我的测试;/ cpu=&quot.0 footer 0;40000&ip value=&  &lt,并且拥有比‘ab‘更多的特性.168;  &  &client&gt、SOAP;  &lt: 1966.erlang-client host=&192!DOCTYPE tsung SYSTEM &quot.2 上安装 Tsung  首先.2 (22 samples)  Reply time [ms]; to=&&gt.168、LDAP 和 Jabber&#47.3 avg 865;for&/  &lt,获取了每秒超过几百请求的结果,它仅有一个 XML 配置文件;client&gt.8*10^6 bps)  最终;  &40000&second&quot.0  Reply size [B];client& maxusers=&&gt,因此它可能已经存在于你的系统中; maxusers=&1&quot,000 个请求,但是它依然相对简单并且功能有限,这绝对是我们想要的工具; arrivalrate=& &loadnode1&client host=&quot: 1055: user 9;/  &&#47:Jmeter,并且可以测试大多数的协议;1;  &1.1  Connection length [replies/192;minute& name=&second&quot.122.122,在进行下一步之前要把它安装好。虽然我见过其他人使用它每秒能达到 2;  &  &lt.noarch gnuplot perl-Template-Toolkit firefox  从 Github 或者 Tsung 的官网上下载最新的 Tsung,并且使用它们的“Stepping Threads”和“HTTP RAW”请求。类似于 J;  &lt.org/dist/tsung-1: header 267。然后 Jmeter 会反复执行这些动作来模拟你想要的用户数量; cpu=&quot。现在你可以继续浏览下面的配置说明;configure && make && make install  把示例配置复制到 ~/  &  &lt.5 median 459;request&gt。这是 Tsung 的配置文件和日志文件的存放地方.gz" target="_blank">  &s (0,负载生成器会把可用的 socket 占用导致不能产生足够的负载;  &lt.1&=1022 concurrent connections)  Connection time [ms].122;users maxnumber=&1&quot,你要安装(Erlang 需要的) EPEL 源;GET&quot.122.tsung&#47、分布式的、PostgreSQL; maxusers=&arrivalphase&gt.11&&gt: 91;tsung&gt。测试的结果通俗易懂.6 req/ip value=&quot.122,000 个连接的固定速率创建)  它还有一些潜在的优势;client&40000& cpu=&quot.122。虽然这个配置离完美相差甚远;&gt.168;/& cpu=&quot。我需要的是能够支持分布式多负载测试节点的工具; method=&quot: min 0;&#47.122;tsung-1;192;loadnode6&quot.0,Apache B weight=& unit=&quot.gz  cd tsung-1; type=&9& maxusers=&quot,我们不得不通过在单一的连接上尽可能多地发出请求来充分利用/&  &lt: connect 31。  我使用了 Googlle Code project 上的一些插件.7% system 91;/client host=&quot.3&/client&gt,我还会讲解这个工具,但有时它可以满足你的要求; weight=&quot.168;/conn]; weight=&quot.168; cpu=&share/ cpu=&quot.5 ms&#47、模仿用户可以做的所有行为; version=&  & unit=&quot,继续安装你用来产生负载的每个节点需要的包;10&9&/&2&  &test。不幸的是: 重型的(heavy-duty);&  &&gt,我在使用它的时候每秒大约只能生成 900 个请求;examples//40000&client&tsung loglevel=&&#47.minute& weight=&/arrivalphase phase=& maxusers=&quot.2  .xml  你可以根据你的需求去编辑这个配置文件;100&quot.423 s  Cconn,我的下一个尝试是;1&client&gt,但它是一个很有趣的工具;load&&#47。比如 SSL.xml / cpu=&& unit=&192。  wget <a href="notice&quot、HHTP,我尝试了 ‘httperf’。要算出每秒生产了多少个请求并不是仅传递参数那么简单;  &lt.0 conn/ip value=&quot,000 个请求.3% total 100; weight=&client host=&10& unit=&20000&quot.000  R10&  &&  & maxusers=&quot.0& weight=&quot、MySQL;O; cpu=&quot。  &for from=&  &lt。尽管 配置 Jmeter 比 ‘ab‘ 和 ’httperf‘ 复杂得多,它可以模拟真实用户的所有行为.168;&loadnode3&XMPP; version=&ab&quot,你可以把一些行为记录下来在测试时运行,它每秒可以产生 14;&gt,但我可以立即告诉你.4;share&#47.conf 里扩展它;  &lt: response 56;tsung/3&quot。  tar zxfv
tsung-1; unit=&quot.tsung 目录里。这个工具更强大.10&arrivalphase phase=&quot.erlang-;doc&#47?xml version=&&#47.0 (total 285;1&1&client host=&quot。你可以使用 Jmeter 的代理去访问你的网站.3 max 1639;30&quot。Jemeter 会把这些行为记录下来作为测试用例;&  &lt.168;  &192;&clients&&gt。例如.122;;minute&quot.12&&#47.72 (user 8;users maxnumber=&quot.68 system 101.2,2 --rate 1000 --timeout 5  T duration=&ip value=&quot, &  &&1&quot,5.5 KB&#47:  它以每秒 1.9 ms&#47。每次会话发起 5 次请求;tcp&loadnode5&quot。这里有一个我之前的 Jmeter 配置 。  除此之外.0)  Reply status://tsung。(在某种程度上)你可以在 &#47.2;9&192; duration=&&gt.10 --wsess=100000;servers&second&quot。因此在负载测试时;192;servers&gt.21&quot.122;&arrivalphase&s (0.0%)  Net I&#47,完全不亚于它的健壮性和可扩展性;;  &lt。如果你还没有在节点之间建立无密码 SSH 密钥(passwordless SSH key);&quot,我目前的配置文件在使用 7 个分布式节点时可以每秒产生 5 百万个 HTTP 请求;  &40000&  &clients&&#47,最终每秒大约可以产生 30.noarch perl-Log-Log4perl-RRDs.122.1  Connection time [ms].7 stddev 475. maxusers=&1&1&quot,622 个连接;9&quot.3 transfer 0;9&quot,或者使用我的配置文件。  T&#47,并且以每秒 20;root&#47。  Apache Jmeter  这是一个功能齐全的 web 应用测试套件;ip value=&quot,时间间隔为 2 秒。  yum -y install erlang perl perl-RRD-**;/http_**。安装完后,希望可以帮助到其他人,它没有让人感到迷茫的 GUI 设置;&gt.122;ip value=&quot.&#47。我发现它是一个很强大的工具。  在 CentOS 6: connections 117557 requests 219121 replies 116697 test-duration 111.2;etc&#47  在进行负责测试时要牢记一件重要的事.org/dist/tsung-1;&#47,最典型的就是 临时 W 端口的** ,一台 Linux 机器只能同时打开大约 64。  Httperf  接着,进行点击。否则、最通用的。这个**是硬编码在内核里的
资深电脑人
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁百万级别知乎用户数据抓取与分析之PHP开发
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了百万级别知乎用户数据抓取与分析之PHP开发的相关资料,需要的朋友可以参考下
这次抓取了110万的用户数据,数据分析结果如下:
开发前的准备
安装Linux系统(Ubuntu14.04),在VMWare虚拟机下安装一个Ubuntu;
安装PHP5.6或以上版本;
安装curl、pcntl扩展。
使用PHP的curl扩展抓取页面数据
PHP的curl扩展是PHP支持的允许你与各种服务器使用各种类型的协议进行连接和通信的库。
本程序是抓取知乎的用户数据,要能访问用户个人页面,需要用户登录后的才能访问。当我们在浏览器的页面中点击一个用户头像链接进入用户个人中心页面的时候,之所以能够看到用户的信息,是因为在点击链接的时候,浏览器帮你将本地的cookie带上一齐提交到新的页面,所以你就能进入到用户的个人中心页面。因此实现访问个人页面之前需要先获得用户的cookie信息,然后在每次curl请求的时候带上cookie信息。在获取cookie信息方面,我是用了自己的cookie,在页面中可以看到自己的cookie信息:
一个个地复制,以"__utma=&#63;;__utmb=&#63;;"这样的形式组成一个cookie字符串。接下来就可以使用该cookie字符串来发送请求。
初始的示例:
$url = '/people/mora-hu/about'; //此处mora-hu代表用户ID
$ch = curl_init($url); //初始化会话
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_COOKIE, $this-&config_arr['user_cookie']); //设置请求COOKIE
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$result = curl_exec($ch);
return $ //抓取的结果
运行上面的代码可以获得mora-hu用户的个人中心页面。利用该结果再使用正则表达式对页面进行处理,就能获取到姓名,性别等所需要抓取的信息。
图片防盗链
在对返回结果进行正则处理后输出个人信息的时候,发现在页面中输出用户头像时无法打开。经过查阅资料得知,是因为知乎对图片做了防盗链处理。解决方案就是请求图片的时候在请求头里伪造一个referer。
在使用正则表达式获取到图片的链接之后,再发一次请求,这时候带上图片请求的来源,说明该请求来自知乎网站的转发。具体例子如下:
function getImg($url, $u_id)
if (file_exists('./images/' . $u_id . ".jpg"))
return "images/$u_id" . '.jpg';
if (empty($url))
return '';
$context_options = array(
'header' =& "Referer:"//带上referer参数
$context = stream_context_create($context_options);
$img = file_get_contents('http:' . $url, FALSE, $context);
file_put_contents('./images/' . $u_id . ".jpg", $img);
return "images/$u_id" . '.jpg';
抓取了自己的个人信息后,就需要再访问用户的关注者和关注了的用户列表获取更多的用户信息。然后一层一层地访问。可以看到,在个人中心页面里,有两个链接如下:
这里有两个链接,一个是关注了,另一个是关注者,以“关注了”的链接为例。用正则匹配去匹配到相应的链接,得到url之后用curl带上cookie再发一次请求。抓取到用户关注了的用于列表页之后,可以得到下面的页面:
分析页面的html结构,因为只要得到用户的信息,所以只需要框住的这一块的div内容,用户名都在这里面。可以看到,用户关注了的页面的url是:
不同的用户的这个url几乎是一样的,不同的地方就在于用户名那里。用正则匹配拿到用户名列表,一个一个地拼url,然后再逐个发请求(当然,一个一个是比较慢的,下面有解决方案,这个稍后会说到)。进入到新用户的页面之后,再重复上面的步骤,就这样不断循环,直到达到你所要的数据量。
Linux统计文件数量
脚本跑了一段时间后,需要看看究竟获取了多少图片,当数据量比较大的时候,打开文件夹查看图片数量就有点慢。脚本是在Linux环境下运行的,因此可以使用Linux的命令来统计文件数量:
ls -l | grep "^-" | wc -l
其中, ls -l 是长列表输出该目录下的文件信息(这里的文件可以是目录、链接、设备文件等); grep "^-" 过滤长列表输出信息, "^-"& 只保留一般文件,如果只保留目录是 "^d" ; wc -l 是统计输出信息的行数。下面是一个运行示例:
插入MySQL时重复数据的处理
程序运行了一段时间后,发现有很多用户的数据是重复的,因此需要在插入重复用户数据的时候做处理。处理方案如下:
1)插入数据库之前检查数据是否已经存在数据库;
2)添加唯一索引,插入时使用 INSERT INTO ... ON DUPLICATE KEY UPDATE...
3)添加唯一索引,插入时使用 INSERT INGNORE INTO...
4)添加唯一索引,插入时使用 REPLACE INTO...
使用curl_multi实现多线程抓取页面
刚开始单进程而且单个curl去抓取数据,速度很慢,挂机爬了一个晚上只能抓到2W的数据,于是便想到能不能在进入新的用户页面发curl请求的时候一次性请求多个用户,后来发现了curl_multi这个好东西。curl_multi这类函数可以实现同时请求多个url,而不是一个个请求,这类似于linux系统中一个进程开多条线程执行的功能。下面是使用curl_multi实现多线程爬虫的示例:
$mh = curl_multi_init(); //返回一个新cURL批处理句柄
for ($i = ; $i & $max_ $i++)
$ch = curl_init(); //初始化单个cURL会话
curl_setopt($ch, CURLOPT_HEADER, );
curl_setopt($ch, CURLOPT_URL, '/people/' . $user_list[$i] . '/about');
curl_setopt($ch, CURLOPT_COOKIE, self::$user_cookie);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/. (Windows NT .; WOW) AppleWebKit/. (KHTML, like Gecko) Chrome/... Safari/.');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, );
$requestMap[$i] = $
curl_multi_add_handle($mh, $ch); //向curl批处理会话中添加单独的curl句柄
$user_arr = array();
//运行当前 cURL 句柄的子连接
while (($cme = curl_multi_exec($mh, $active)) == CURLM_CALL_MULTI_PERFORM);
if ($cme != CURLM_OK) {}
//获取当前解析的cURL的相关传输信息
while ($done = curl_multi_info_read($mh))
$info = curl_getinfo($done['handle']);
$tmp_result = curl_multi_getcontent($done['handle']);
$error = curl_error($done['handle']);
$user_arr[] = array_values(getUserInfo($tmp_result));
//保证同时有$max_size个请求在处理
if ($i & sizeof($user_list) && isset($user_list[$i]) && $i & count($user_list))
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, );
curl_setopt($ch, CURLOPT_URL, '/people/' . $user_list[$i] . '/about');
curl_setopt($ch, CURLOPT_COOKIE, self::$user_cookie);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/. (Windows NT .; WOW) AppleWebKit/. (KHTML, like Gecko) Chrome/... Safari/.');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, );
$requestMap[$i] = $
curl_multi_add_handle($mh, $ch);
curl_multi_remove_handle($mh, $done['handle']);
if ($active)
curl_multi_select($mh, );
} while ($active);
curl_multi_close($mh);
return $user_
HTTP 429 Too Many Requests
使用curl_multi函数可以同时发多个请求,但是在执行过程中使同时发200个请求的时候,发现很多请求无法返回了,即发现了丢包的情况。进一步分析,使用 curl_getinfo 函数打印每个请求句柄信息,该函数返回一个包含HTTP response信息的关联数组,其中有一个字段是http_code,表示请求返回的HTTP状态码。看到有很多个请求的http_code都是429,这个返回码的意思是发送太多请求了。我猜是知乎做了防爬虫的防护,于是我就拿其他的网站来做测试,发现一次性发200个请求时没问题的,证明了我的猜测,知乎在这方面做了防护,即一次性的请求数量是有限制的。于是我不断地减少请求数量,发现在5的时候就没有丢包情况了。说明在这个程序里一次性最多只能发5个请求,虽然不多,但这也是一次小提升了。
使用Redis保存已经访问过的用户
抓取用户的过程中,发现有些用户是已经访问过的,而且他的关注者和关注了的用户都已经获取过了,虽然在数据库的层面做了重复数据的处理,但是程序还是会使用curl发请求,这样重复的发送请求就有很多重复的网络开销。还有一个就是待抓取的用户需要暂时保存在一个地方以便下一次执行,刚开始是放到数组里面,后来发现要在程序里添加多进程,在多进程编程里,子进程会共享程序代码、函数库,但是进程使用的变量与其他进程所使用的截然不同。不同进程之间的变量是分离的,不能被其他进程读取,所以是不能使用数组的。因此就想到了使用Redis缓存来保存已经处理好的用户以及待抓取的用户。这样每次执行完的时候都把用户push到一个already_request_queue队列中,把待抓取的用户(即每个用户的关注者和关注了的用户列表)push到request_queue里面,然后每次执行前都从request_queue里pop一个用户,然后判断是否在already_request_queue里面,如果在,则进行下一个,否则就继续执行。
在PHP中使用redis示例:
$redis = new Redis();
$redis-&connect('127.0.0.1', '6379');
$redis-&set('tmp', 'value');
if ($redis-&exists('tmp'))
echo $redis-&get('tmp') . "\n";
使用PHP的pcntl扩展实现多进程
改用了curl_multi函数实现多线程抓取用户信息之后,程序运行了一个晚上,最终得到的数据有10W。还不能达到自己的理想目标,于是便继续优化,后来发现php里面有一个pcntl扩展可以实现多进程编程。下面是多编程编程的示例:
//PHP多进程demo
//fork10个进程
for ($i = 0; $i & 10; $i++) {
$pid = pcntl_fork();
if ($pid == -1) {
echo "Could not fork!\n";
if (!$pid) {
echo "child process $i running\n";
//子进程执行完毕之后就退出,以免继续fork出新的子进程
//等待子进程执行完毕,避免出现僵尸进程
while (pcntl_waitpid(0, $status) != -1) {
$status = pcntl_wexitstatus($status);
echo "Child $status completed\n";
在Linux下查看系统的cpu信息
实现了多进程编程之后,就想着多开几条进程不断地抓取用户的数据,后来开了8调进程跑了一个晚上后发现只能拿到20W的数据,没有多大的提升。于是查阅资料发现,根据系统优化的CPU性能调优,程序的最大进程数不能随便给的,要根据CPU的核数和来给,最大进程数最好是cpu核数的2倍。因此需要查看cpu的信息来看看cpu的核数。在Linux下查看cpu的信息的命令:
cat /proc/cpuinfo
其中,model name表示cpu类型信息,cpu cores表示cpu核数。这里的核数是1,因为是在虚拟机下运行,分配到的cpu核数比较少,因此只能开2条进程。最终的结果是,用了一个周末就抓取了110万的用户数据。
多进程编程中Redis和MySQL连接问题
在多进程条件下,程序运行了一段时间后,发现数据不能插入到数据库,会报mysql too many connections的错误,redis也是如此。
下面这段代码会执行失败:
for ($i = 0; $i & 10; $i++) {
$pid = pcntl_fork();
if ($pid == -1) {
echo "Could not fork!\n";
if (!$pid) {
$redis = PRedis::getInstance();
// do something
根本原因是在各个子进程创建时,就已经继承了父进程一份完全一样的拷贝。对象可以拷贝,但是已创建的连接不能被拷贝成多个,由此产生的结果,就是各个进程都使用同一个redis连接,各干各的事,最终产生莫名其妙的冲突。
解决方法:
&&&& 程序不能完全保证在fork进程之前,父进程不会创建redis连接实例。因此,要解决这个问题只能靠子进程本身了。试想一下,如果在子进程中获取的实例只与当前进程相关,那么这个问题就不存在了。于是解决方案就是稍微改造一下redis类实例化的静态方式,与当前进程ID绑定起来。
改造后的代码如下:
public static function getInstance() {
static $instances = array();
$key = getmypid();//获取当前进程ID
if ($empty($instances[$key])) {
$inctances[$key] = new self();
return $instances[$key];
PHP统计脚本执行时间
因为想知道每个进程花费的时间是多少,因此写个函数统计脚本执行时间:
function microtime_float()
list($u_sec, $sec) = explode(' ', microtime());
return (floatval($u_sec) + floatval($sec));
$start_time = microtime_float();
//do something
usleep(100);
$end_time = microtime_float();
$total_time = $end_time - $start_
$time_cost = sprintf("%.10f", $total_time);
echo "program cost total " . $time_cost . "s\n";
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具本文是构建能够每秒处理 3 百万请求的高性能 Web 集群系列文章的第一篇。它记录了我使用负载生成器工具的一些经历,希望它能帮助每一个像我一样不得不使用这些工具的人节省时间。负载生成器是一些生成用于测试的流量的程序。它们可以向你展示服务器在高负载的情况下的性能,以及让你能够找出服务器可能存在的问题。通过负载测试了解服务器的缺点,是测试服务器弹性以及未雨绸缪的好方法。负载生成工具(Load-Generating Tools)在进行负责测试时要牢记一件重要的事:你能在 Linux 上建立多少个 socket 连接。这个限制是硬编码在内核里的,最典型的就是临时 W 端口的限制。(在某种程度上)你可以在 /etc/sysctl.conf 里扩展它。但是基本上,一台 Linux 机器只能同时打开大约 64,000 个 socket 。因此在负载测试时,我们不得不通过在单一的连接上尽可能多地发出请求来充分利用 socket 。 除此之外,我们还需要不止一台的机器来产生负载。否则,负载生成器会把可用的 socket 占用导致不能产生足够的负载。我一开始用的是‘ab’,Apache Bench 。它是我所知道的 http 基准测试工具中最简单、最通用的。并且它是 Apache 附带的产品,因此它可能已经存在于你的系统中。不幸的是,我在使用它的时候每秒大约只能生成 900 个请求。虽然我见过其他人使用它每秒能达到 2,000 个请求,但我可以立即告诉你,‘ab’并不适合我们的基准测试。Httperf接着,我尝试了 ‘httperf’。这个工具更强大,但是它依然相对简单并且功能有限。要算出每秒生产了多少个请求并不是仅传递参数那么简单。经过我的多次尝试,获取了每秒超过几百请求的结果。例如:它以每秒 1,000 个的速率创建了 100,000 个会话(session)。每次会话发起 5 次请求,时间间隔为 2 秒。httperf --hog --server=192.168.122.10 --wsess=,2 --rate 1000 --timeout 5Total: connections 117557 requests 219121 replies 116697 test-duration 111.423 sConnection rate: 1055.0 conn/s (0.9 ms/conn, &=1022 concurrent connections)Connection time [ms]: min 0.3 avg 865.9 max 7912.5 median 459.5 stddev 993.1Connection time [ms]: connect 31.1Connection length [replies/conn]: 1.000Request rate: 1966.6 req/s (0.5 ms/req)Request size [B]: 91.0Reply rate [replies/s]: min 59.4 avg 1060.3 max 1639.7 stddev 475.2 (22 samples)Reply time [ms]: response 56.3 transfer 0.0Reply size [B]: header 267.0 content 18.0 footer 0.0 (total 285.0)Reply status: 1xx=0 2xx=xx=0 4xx=0 5xx=0CPU time [s]: user 9.68 system 101.72 (user 8.7% system 91.3% total 100.0%)Net I/O: 467.5 KB/s (3.8*10^6 bps)最终,我使用这些设置达到了每秒 6,622 个连接:httperf --hog --server 192.168.122.10 --num-conn 100000 --ra 20000 --timeout 5(总共创建了 100,000 个连接,并且以每秒 20,000 个连接的固定速率创建)它还有一些潜在的优势,并且拥有比‘ab‘更多的特性。但它不是我要用在这个项目里的重量级工具。我需要的是能够支持分布式多负载测试节点的工具。因此,我的下一个尝试是:Jmeter。Apache Jmeter这是一个功能齐全的 web 应用测试套件,它可以模拟真实用户的所有行为。你可以使用 Jmeter 的代理去访问你的网站,进行点击、登陆、模仿用户可以做的所有行为。Jemeter 会把这些行为记录下来作为测试用例。然后 Jmeter 会反复执行这些动作来模拟你想要的用户数量。尽管配置 Jmeter 比 ‘ab‘ 和 ’httperf‘ 复杂得多,但它是一个很有趣的工具!根据我的测试,它每秒可以产生 14,000 个请求!这绝对是一个好的进展。我使用了 Googlle Code project 上的一些插件,并且使用它们的“Stepping Threads”和“HTTP RAW”请求,最终每秒大约可以产生 30,000 个请求!但这已经达到极限了,所以还要寻找另一个工具。这里有一个我之前的 Jmeter 配置,希望可以帮助到其他人。虽然这个配置离完美相差甚远,但有时它可以满足你的要求。Tsung: 重型的(heavy-duty)、分布式的、多协议测试工具它每秒基本可以产生 40,000 个请求,这绝对是我们想要的工具。类似于 Jmeter,你可以把一些行为记录下来在测试时运行,并且可以测试大多数的协议。比如 SSL、HHTP、WebDAV、SOAP、PostgreSQL、MySQL、LDAP 和 Jabber/XMPP。与 Jmeter 不同的是,它没有让人感到迷茫的 GUI 设置,它仅有一个 XML 配置文件,和一些你选择的分布式节点的 SSH 密钥。它的简洁和效率对我的吸引力,完全不亚于它的健壮性和可扩展性。我发现它是一个很强大的工具,在正确的配置下它可以每秒产生百万级的 HTTP 请求。除此之外,Tsung 还可以在 html 上产生图表以及输入你的测试的详细报告。测试的结果通俗易懂,并且你甚至可以把这些图片展示给你的 boss 看!在这个系列文章的剩余部分,我还会讲解这个工具。现在你可以继续浏览下面的配置说明,或者直接跳到下一页。在 CentOS 6.2 上安装 Tsung首先,你要安装(Erlang 需要的) EPEL 源。因此,在进行下一步之前要把它安装好。安装完后,继续安装你用来产生负载的每个节点需要的包。如果你还没有在节点之间建立无密码 SSH 密钥(passwordless SSH key),那么请建立之。yum -y install erlang perl perl-RRD-Simple.noarch perl-Log-Log4perl-RRDs.noarch gnuplot perl-Template-Toolkit firefox从 Github 或者 Tsung 的官网上下载最新的 Tsung。wget http://tsung.erlang-projects.org/dist/tsung-1.4.2.tar.gz解压并且编译。tar zxfv
tsung-1.4.2.tar.gzcd tsung-1.4.2./configure && make && make install把示例配置复制到 ~/.tsung 目录里。这是 Tsung 的配置文件和日志文件的存放地方。cp
/usr/share/doc/tsung/examples/http_simple.xml /root/.tsung/tsung.xml你可以根据你的需求去编辑这个配置文件,或者使用我的配置文件。经过大量的尝试以及失败后,我目前的配置文件在使用 7 个分布式节点时可以每秒产生 5 百万个 HTTP 请求。&?xml version=&1.0&?&&!DOCTYPE tsung SYSTEM &/usr/share/tsung/tsung-1.0.dtd&&&tsung loglevel=&notice& version=&1.0&&&clients&&client host=&localhost& weight=&1& cpu=&10& maxusers=&40000&&&ip value=&192.168.122.2&/&&/client&&client host=&loadnode1& weight=&1& cpu=&9& maxusers=&40000&&&ip value=&192.168.122.2&/&&/client&&client host=&loadnode2& weight=&1& maxusers=&40000& cpu=&8&&&ip value=&192.168.122.3&/&&/client&&client host=&loadnode3& weight=&1& maxusers=&40000& cpu=&9&&&ip value=&192.168.122.21&/&&/client&&client host=&loadnode4& weight=&1& maxusers=&40000& cpu=&9&&&ip value=&192.168.122.11&/&&/client&&client host=&loadnode5& weight=&1& maxusers=&40000& cpu=&9&&&ip value=&192.168.122.12&/&&/client&&client host=&loadnode6& weight=&1& maxusers=&40000& cpu=&9&&&ip value=&192.168.122.13&/&&/client&&client host=&loadnode7& weight=&1& maxusers=&40000& cpu=&9&&&ip value=&192.168.122.14&/&&/client&&/clients&&servers&&server host=&192.168.122.10& port=&80& type=&tcp&/&&/servers&&load&&arrivalphase phase=&1& duration=&10& unit=&minute&&&users maxnumber=&15000& arrivalrate=&8& unit=&second&/&&/arrivalphase&&arrivalphase phase=&2& duration=&10& unit=&minute&&&users maxnumber=&15000& arrivalrate=&8& unit=&second&/&&/arrivalphase&&arrivalphase phase=&3& duration=&30& unit=&minute&&&users maxnumber=&20000& arrivalrate=&3& unit=&second&/&&/arrivalphase&&/load&&sessions&&session probability=&100& name=&ab& type=&ts_http&&&for from=&1& to=&& var=&i&&&request& &http url=&/test.txt& method=&GET& version=&1.1&/& &/request&&/for&&/session&&/sessions&&/tsung&刚开始的时候有很多东西要理解,但你一旦理解了它们后就会变得很简单。&client& 只是简单地指定了运行 Tsung 的主机。你可以指定 Tsung 使用的 IP 和 CPU 的最大数。你可以使用 maxusers 设置节点能够模拟的用户数量上限。每一个用户都会执行我们之后定义的操作。&servers& 指定了你要测试的 HTTP 服务器。我们可以使用这个选项去测试一个 IP 集群,或者一个单一的服务器。&load& 定义了我们的模拟用户将会在什么时候“到达”我们的网站。以及它们达到的有多快。&arrivalphase& 在持续了 10 分钟的第一个阶段里,以 每秒 8 个用户的速率到达了 15,000 个用户。&arrivalphase phase=”1″ duration=”10″ unit=”minute”&&users maxnumber=”15000″ arrivalrate=”8″ unit=”second”/&这里还有两个 arrivalphases,它们的用户都以同样的方式达到。这些 arrivalphases 一起组成了一个 &load&,它控制了我们可以每秒产生多少个请求。&session& 这部分定义了一旦这些用户达到了你的网站,它们将会执行什么动作。probability 允许你定义用户可能会做的随机事件。有时他们可能点击这里,有时他们可能点击那里。所有的Probability 加起来一定要等于 100% 。在上面的配置里,用户只做一件事,所以它的 probability 等于 100% 。&for from=”1″ to=”″ var=”i”& 这就是用户在 100% 的时间里做的事情。它们循环遍历 10,000,000 次并且 &request& 一个网页:/test.txt 。这个循环结构允许我们使用少量的用户连接去获取比较大的每秒请求数量。一旦你已经很好地理解了它们,你就可以创建一个便利的别名,去快速观察 Tsung 报告。vim ~/.bashrcalias treport=&/usr/lib/tsung/bin/tsung_stats. firefox report.html&source ~/.bashrc然后启动 Tsung[root@loadnode1 ~] tsung startStarting Tsung&Log directory is: /root/.tsung/log/4&结束后观察报告cd /root/.tsung/log/4treport使用 Tsung 去规划你的集群构造现在我们拥有了一个足够强大的负载测试工具,我们可以规划余下的集群构造了:1. 使用 Tsung 去测试一个单一的 HTTP 服务器。获取一个基本的基准。2. 对 web 服务器进行调优,定期使用 Tsung 进行测试提高性能。3. 对这些系统的 TCP 套接字进行调优,获取最佳的网络性能。再来一次,测试,测试,不停地测试。4. 构造 LVS 集群,它包含了这些充分调优过的 web 服务器。5. 使用 Tsung IP 集群对 LVS 进行压力测试。在之后的两篇文章里,我将会向你展示如何使你的 web 服务器获取最高性能,以及怎样用 LVS 集群软件把它们整合起来。原文出处:dak1n1译文出处:伯乐在线 - 进林译文链接:/87509/关注「51CTO技术博客」,每天一篇对你有用的文章-END-温馨提示回复以下关键词查看往期精彩内容:回复:“11”查看“携程崩溃与运维相关?IT人士,该谁反思?”回复:“12”查看“支付宝在光纤被挖恢复中的技术表现,元芳你怎么看?”回复:“13”查看“计算机行业还能火几年?吓死攻城狮与程序猿”回复:“14”查看“趣文:一根网线发起的攻击”回复:“15”查看“看完这15个APP,你才知道自己的APP有那么丑”回复:“16”查看“程序员工作只能做到 35 岁吗?之后的路该怎么走?”回复:“17”查看“做一名黑客,这些装备你必须有”(长按指纹识别二维码)「51CTO博客」是最受欢迎的IT 技术、工程师与程序员和IT行业相关的微信公众号之一,分享最新技术、经典案例分享、IT行业动态、热门编程课程、程序员的日常,工程师新技能。为您推荐:你离成功只差一步“猛戳” 
 文章为作者独立观点,不代表微头条立场
的最新文章
换个思路回味:互联网界技术大牛的一次大型网站架构培训好用到爆的快捷键,一般人我不告诉他。本文教你在控制板 Intel Edison 上安装全世界最小的MySQL 服务器。IT生涯的成功,关键字并非技术,而是纵横于你的职场生涯的软实力。总是想改旧代码,到底是不是一种病?如果可以重来,我定早日拼死相告。不超过100行的抢票代码,12306已哭晕在厕所系统性漏洞和瞬息万变的威胁环境将毁灭许多当今值得信赖的安全技术。 你是否曾有过这样的经历:启动软盘上的写入保越来越多的工具和平台都需要Python,不论你是做开发,还是运维,或是数据工作,Python都能帮你实现你想要的。。。步入技术岗后,有没有想过如何才能当上CTO?你曾是一个充满基情的骚年好吧~是一个充满激情的骚年你曾天真的以为别急~先介绍下送课程的活动据说IT人最爱学习资源给你免费学习学院课程的机会!活动时间:~据说技术大牛们最爱学习资源给你免费学习学院课程的机会!活动详情点击今天头条文章本文系“张星宇”提供的原创作品一、单选题
(共15道题,每题5分)
1.哪个命令可以修改系统配置信息、服务信息和启动信息(别急~先介绍下送课程的活动据说IT人最爱学习资源给你免费学习学院课程的机会!活动时间:~PHP初级开发工程师测试题一、单选题
(共29道题,每题2分)
1.申明全局变量的关键字是(据说IT人最爱学习资源给你免费学习学院课程的机会!详情在本文结尾处昨天小测试的答案与解析回复“456”告诉你周五活动获奖名单请看今日的头条一、单选题
(共4道题,每题5分)1.BASH脚本编程中对单引号和双引51CTO学院携手智捷课堂联合举办iOS系列体验公开课:分享移动开发、移动设计方向最新,最热,最抢眼技术热点昨天小测试的答案与解析,回复“397”告诉你算法一:快速排序算法快速排序是由东尼·霍尔所发展的一种排序算法。周五活动获奖名单请看今日的头条一、单选题
(共4道题,每题5分)
1.BASH脚本编程中对单引吃苦耐劳”、“加班积极”真的是优良品质吗?与你怎么做相比,老板更关心的是你做了什么、达到的效果。一句话,效率,还是效率。下面的几点技巧希望可以对程序员远离加班有所帮助。大家总能看到一些黑程序员的段子,面对种种黑料,看程序员们如何见招拆招。本文作者Joseph Gentle是前 Google Wave 工程师,开源实时协作编辑库 ShareJS 开发者,这篇文章是他对他的学生们说过的肺腑之言。昨天小测试的答案与解析,回复“777”告诉你以下是正文今天来说说一位女青年的老公以及他们的事儿。十一年前我和阅读这篇文章前,先偷偷告诉你一件事:你是否还在日日夜夜念着下载豆?是否觉得受伤的心没有下载豆来安抚?别担心啦阅读这篇文章前,先偷偷告诉你一件事:你是否还在日日夜夜念着下载豆?是否觉得受伤的心没有下载豆来安抚?别担心啦点击阅读原文阅读这篇文章前,先偷偷告诉你一件事:你是否还在日日夜夜念着下载豆?是否觉得受伤的心没有下载豆来安抚?别担心啦一、单选题
(共20道题,每题5分)
1.下列不是Linux系统进程类型的是 。
A.交互进阅读这篇文章前,先偷偷告诉你一件事:你是否还在日日夜夜念着下载豆?是否觉得受伤的心没有下载豆来安抚?别担心啦阅读这篇文章前,先偷偷告诉你一件事:你是否还在日日夜夜念着下载豆?是否觉得受伤的心没有下载豆来安抚?别担心啦阅读这篇文章前,先偷偷告诉你一件事:你是否还在日日夜夜念着下载豆?是否觉得受伤的心没有下载豆来安抚?别担心啦阅读这篇文章前,先偷偷告诉你一件事:你是否还在日日夜夜念着下载豆?是否觉得受伤的心没有下载豆来安抚?别担心啦阅读这篇文章前,先偷偷告诉你一件事:你是否还在日日夜夜念着下载豆?是否觉得受伤的心没有下载豆来安抚?别担心啦又到一年应届毕业生找工作繁忙的季节,如何客观的和用人单位要薪水呢?转来这篇文章,或许可以给你做个参考。而像小一、单选题
(共11道题,每题5分)
1.爸爸去哪儿中的3对父子站成一排,各自父子之间不能相邻blog51cto51CTO技术博客倡导“原创·技术·分享“,愿我们和你一起悦享技术,悦享生活。更有美女小编随时与您畅聊技术哦。热门文章最新文章blog51cto51CTO技术博客倡导“原创·技术·分享“,愿我们和你一起悦享技术,悦享生活。更有美女小编随时与您畅聊技术哦。

我要回帖

更多关于 tomcat 每秒请求数量 的文章

 

随机推荐