月度归档:2013年01月

ab压力测试

ab命令是apache自带的压力测试工具,全称apache bench。它可以模拟并发访问,得到服务器(或服务接口)的基本抗压情况,例如吞吐率、请求平均响应时间、用户平均响应时间等等。为减少网络延时带来的影响,ab测试最好放在服务器上或者与服务器在相同内网的机器上。

基本用法:

1
ab [options] [http[s]://]hostname[:port]/path

例如:

1
ab -n 30 -c 5 http://127.0.0.1:8080/sync

其中,-n指定请求个数,-c指定并发数,上面的命令表示模拟5个并发线程,向http://127.0.0.1:8080/sync发送30个请求。
其他较常用的参数还包括-H, 用来指定HTTP请求头(包括自定义头)。 -p用来指定POST请求体所在的文件位置。

如果正常执行,ab命令会返回:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
root$ ab -n 30 -c 5 http://127.0.0.1:8080/sync
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
 
Benchmarking 127.0.0.1 (be patient).....done
 
Server Software:        Apache-Coyote/1.1
Server Hostname:        127.0.0.1
Server Port:            8080
Document Path:          /sync
Document Length:        0 bytes
Concurrency Level:      5
Time taken for tests:   6.021 seconds
Complete requests:      30
Failed requests:        0
Write errors:           0
Total transferred:      3630 bytes
HTML transferred:       0 bytes
Requests per second:    4.98 [#/sec] (mean)
Time per request:       1003.568 [ms] (mean)
Time per request:       200.714 [ms] (mean, across all concurrent requests)
Transfer rate:          0.59 [Kbytes/sec] received
 
Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:  1002 1003   0.5   1004    1004
Waiting:     1002 1003   0.5   1003    1004
Total:       1003 1003   0.5   1004    1004
 
Percentage of the requests served within a certain time (ms)
  50%   1004
  66%   1004
  75%   1004
  80%   1004
  90%   1004
  95%   1004
  98%   1004
  99%   1004
 100%   1004 (longest request)

其中,Server Software表示服务器server软件,Server Hostname是主机名,Server Port是主机监听端口号,Document Path是请求路径,Document Length是响应的文档大小,Concurrency Level为并发数,Time taken for tests是本次ab压力测试的总用时,Complete requests和Failed requests分别表示完成的请求数和请求失败次数,Total transferred为HTTP响应的总传输量,包含响应头和响应体,HTML transferred为响应体大小。

Requests per second表示每秒响应的请求数,即服务端的吞吐率,Time per request(mean)表示每个并发用户的请求平均响应时间,Time per request(mean, across all concurrent requests)表示每个请求的平均响应时间。这三个值是衡量服务端性能的重要指标,吞吐率和每个请求的平均响应时间互为倒数关系,每个并发用户的请求平均响应时间在数值上等于Time taken for tests / (Complete requests / Concurrency Level),这是从一个并发用户的角度看拿到的值,Complete requests / Concurrency Level是该用户发出的请求数,Time taken for tests是该用户的总用时。

P.S. 我的测试环境是:Mac OS X/10.8.2, Apache/2.2.22,ApacheBench/2.3,测试过程中会随机返回一些apr_socket_recv: Connection reset by peer (54),请求已经到达服务器并执行完毕,只是客户端读取服务器端返回值出了socket异常。Stackoverflow上有讨论,说是MacOS上老版本Apache的bug,升级到新版本即可。或者在命令行中加-r参数,表示“Don't exit on socket receive errors”,让程序继续跑完。

--EOF--

『鼠族』

涉及种族间屠杀的故事读起来总是沉重的,更何况是要亲历者亲述逃亡、集中营和焚尸炉的故事。虽然犹太民族的噩梦结束了半个世纪,但是从『鼠族』中看来,他们的后代过得也并不轻松,正如阿特·斯皮格曼坦言:“我渴望当时能跟父母亲一块在奥斯维辛,这样就能切身体会到他们当年的遭遇,我想,这也许是一种愧疚,愧疚自己的生活比他们安逸”。

之前有看过一些文章,一战结束后,德国作为战败国,受到了来自战胜国抢劫式地搜刮和掠夺,他们控制德国金融,造成天文数字倍数的通胀率,德国货币贬得连纸都不如。这些人里面,就包括不少犹太人。所以,德国人仇恨犹太人的种子早在一九二零年代就已经埋下。值得庆幸的是,如今掌握着话语权的主流社会无论从文明还是从道义上都站在了犹太人一边,德国人业已认罪、忏悔,并积极赔偿,过去几十年,德国的几任总理公开场合表示向犹太人道歉。新闻和艺术的最高奖项也多次颁给了该题材的作品,例如『鼠族』、『辛德勒的名单』、『钢琴家』等等。相比很多正义得不到伸张的故事中的人们,犹太人犹太民族已是幸运。

当然,『鼠族』作为唯一获得普利策奖的漫画小说,其深意并不仅仅停留在表现战争和种族灭绝对幸存者的影响,书中有多处提到作为犹太人幸存者的父亲对待黑人的态度是敌视和粗暴的,理所当然地认为所有黑人都是小偷。这其实跟德国人对待犹太人的态度是一样的。所以,彻底摒弃种族歧视在目前的文明社会中还做不到,在大家心中,人种还是分三六九等,犹太人受到过歧视和伤害,并不表示犹太人就会对所有人种都是友善的。人们的反省并不足够。

--EOF--

系统权限管理分类

当前各类网站主流的访问控制手段是基于角色的,采用的都是RBAC机制。它定义出系统中的不同角色,不同角色权限不同。验证时,只需判断用户属于哪种角色,就能根据对应的权限进行访问控制。

基于角色的访问控制按角色权限高低可分为两类:垂直权限控制和水平权限控制。

垂直权限控制作用在两类不同权限的角色之间,例如A是普通用户,B是管理员用户,那么B就拥有更多的可访问资源,这些资源包括某个URL下的资源、系统中的某个接口调用等。对于垂直权限控制,各编程平台都会有一些框架可以利用,因为垂直权限控制易于抽象,与具体业务耦合较少。Java Web开发程序员可以利用Spring Security,通过一些配置即可完成系统中的垂直权限控制需求(可基于URL和基于Method)[1]

水平权限控制是作用与相同的角色之间的。例如A、 B都是社交网站的用户,他们对该网站上的资源拥有同样的权限,但是各自又都有一些私有数据,类似私信列表、好友列表。因为构造一个获取其他用户私有页面的URL(REST风格,很好构造)是很简单的,所以A用户可能只要改下URL中的ID等信息就能得到B用户的URL,这个环节不做权限控制显然不合理,而这里又很容易被疏忽掉。试想动辄上百个接口或URL,对每个都要做这样的水平权限判断,漏掉任何一个都会造成潜在漏洞。此外,这类漏洞自动化工具还不好扫描,不易察觉。因为水平权限控制判断的依据已经是数据级别的,所以一般框架较难处理这类情况,程序架构好点的可以通过拦截器对同类接口参数进行过滤和判断。否则,也只能具体接口具体判断了。

[1] 吴翰清. 白帽子讲Web安全. 电子工业出版社, 2012.06.

--EOF--