siege是如何运行的-基于版本2.55

花了一天看了部分源码。

1关于配置

参数配置和URL配置分别是2个文件。

2 启动多个线程,默认是15个线程

每个线程根据一定的策略来遍历所有的URL.

这里的策略可以是轮询,也可以是随机,

if( my.internet )
{
	y = my_random( my.length, (int)pthread_self());
}
else
{
	y = ( y < my.length ) ? y : 0;
}

通过这个代码可见上面是随机,下面是轮询。

3 对于每个线程的每个URL请求。

是否可写?-》写入请求-》是否可读?-》读取header->是否可读?-》读取content->关闭socket.

4 关于cookie

会保存在全局cookie结构体链表中,每个节点的核心数据是线程ID及所属域名。

这样根据需要应该及时读取cookie.

具体详细代码我没看,不过我以前做HI5的HTTP报文解析的时候知道cookie也会变的。

所以让我来写,肯定也是要及时增删cookie的具体的name/value对的。

 

5 关于失败次数

if(( http_request( urls[y], d ) == -1 )) 
my.failed++;

if( my.failed >= my.failures )
{
     break;
 }

这里很明显my是全局变量,如果在线程里对其进行操作,肯定是需要加锁的,

发现这个bug后,我下了最新版本3.0.6的代码,发现这个bug已经修复了。

private void
__increment_failures()
{
  pthread_mutex_lock(&(my.lock));
  my.failed++;
  pthread_mutex_unlock(&(my.lock));
  pthread_testcancel();
}

这让我想起之前看另外一个源码cherokee时,这个软件老的版本也是有很多做的不好的地方。

源码看多了,在看各个软件的过程中就会有自己的批判精神,我想这也是学源码的意义所在。

6 siege2.55版本的很多问题是存在容易引起core dump文件的可能性。

 

个人觉得siege2.55版本的代码,核心价值在于学习它的多线程API使用上。

等我看懂了会再开一篇博文,计划这篇博文不是基于2.55版本,而是基于版本 2.56.

你可能感兴趣的:(siege)