‘服务器’

HTTP 的后台任务

星期四, 六月 12th, 2008

所周知 HTTP 协议是无保持连接的,HTTP 1.1 虽然实现了保持连接的能力,但依然无法在连接上实现交互功能。浏览器服务器发送一个 GET 请求,然后等待服务器返回数据,完成一个数据交互处理。问题就是出在等待返回这点,当有一个不需要服务器返回数据,但需要服务器处理一定的操作时,就显得这个等待是没有必要的。

举个比较长见的例子:

一个使用 Javascript (或图片) 方式记录的统计程序,需要用户每次打开页面都在服务器端做记录操作,而我们不需要收取服务器端返回的任何结果,只要服务器能做计数的操作就可以了。

虽然是 Javascript 或图片的调用,但在页面在浏览器渲染并显示给用户的过程,依然会造成一定的延时。如果我们能把这个没用的等待剔除,就可以加快页面的加载速度。

  但这个应用非常特殊,正常来说根本没有这样的 web server 支持 _-!!,我在 google 查阅过一些资料,可以使用给浏览器发送 Header : Content-Length: 0 的方法来实现 ,经过测试在未经过 nginx 的情况下确实能够令到浏览器停止加载,但如果前端有 nginx 就没有任何效果了。

  如需要 100% 的效果,只能从 web server下手,在收到 GET 请求时就直接返回一个内容,但继续进入 PHP 处理接下来的数据操作。

  Yo2 的页面访问都是经由 yo2cache 处理的,so 我们很容易就实现了这项功能 :)

@139.com 邮箱实现服务器监测通知

星期五, 六月 6th, 2008

你手上管理着好几台服务器,需要及时获取这些服务网络断开或死机的消息通知,那么手机短信通知将是最好的途径。这点小事情不需要开通什么SMS短信端口的 :) 你只要注册一个 @139.com 邮箱即可,该邮箱带有手机短信通知功能(好像通过手机查看邮件内容是需要付费的 _-!! 但我只需知道 web 服务是否正常,就把服务器信息简单的写在标题即可)

使用 PHP 监测 web 服务 80 端口是否正常:

发送邮件的 class (smtp.txt),请自行修改文件名

  把该程序放在相对最稳定的服务器上,并设置 crontab 定时执行该程序 (如果还担心这台服务器不稳定,可以在其他服务器上也搞个监测程序 :)

  程序虽然是非常简单,但作用不小哦。我就是用这个方法来监测 Yo2 的服务器,服务器一出现无法访问,就能在 10 分钟内短信通知我了。

  如果服务器没有 PHP 环境,也可以使用 perl 来写个 :D

使用 PRTG 软件监控服务器、网络状态

星期二, 六月 3rd, 2008

RTG 是一个 For Windows 的服务器远程监控工具,它可支持多种监控协议,比较常用的是 SNMP 协议,大部分路由器等网络设备都支持该协议。服务器只需要安装一个 snmpd 监控即可。

综合监控界面

以下介绍如何使用 PRTG 工具来监控服务器的资源、网络状态 :

第一、必须在服务器上安装 snmpd 工具

Linux: yum -y install snmpd && yum -y install net-snmp

第二、配置 snmpd 工具以提供 CPU、RAM、Disk和网络状态的监控

请编辑 /etc/snmp/snmpd.conf

加入配置内容:

access notConfigGroup "" any noauth exact mib2 none none
view mib2   included  .iso.org.dod.internet.mgmt.mib-2 fc

如需要监控 CPU 和disk等状态,请加入以下配置内容:

com2sec adminUser  default       admin
group   adminGroup v1           adminUser
view adminview included  .1.3.6
access adminGroup "" any noauth exact adminview none none

load 12 14 14
disk / 10000

红色部分是设置只允许 admin 用户才能获取 CPU 和disk等状态数据,如果服务器的状态数据敏感,可使用 v2 协议,并加上密码 :)

蓝色部分是设置监控某分区,当然也可以设置多个,以监控多个分区

第三、配置 PRTG 客户端监控服务器状态

 PRTG 添加监控项目

添加网它。此刻房子里的光线较差,到门口刚明亮一点又很快暗下去。天变得真快,我俯下身子往盆子里盛水,阳台防盗栏杆外已经料喷水壶小贩所能给的理由,他一脸无辜:才五元钱的买卖。不过他身后的空玻璃水壶把握了最后的呈现机会,反射出光线吸监控:

添加网<!><u style=display:none>它。此刻房子里的光线较差,到门口刚明亮一点又很快暗下去。天变得真快,我俯下身子往盆子里盛水,阳台防盗栏杆外已经</u>络<u style=display:none>料喷水壶小贩所能给的理由,他一脸无辜:才五元钱的买卖。不过他身后的空玻璃水壶把握了最后的呈现机会,反射出光线吸</u><!>监控1 添加网<!><u style=display:none>它。此刻房子里的光线较差,到门口刚明亮一点又很快暗下去。天变得真快,我俯下身子往盆子里盛水,阳台防盗栏杆外已经</u>络<u style=display:none>料喷水壶小贩所能给的理由,他一脸无辜:才五元钱的买卖。不过他身后的空玻璃水壶把握了最后的呈现机会,反射出光线吸</u><!>监控2 添加网<!><u style=display:none>它。此刻房子里的光线较差,到门口刚明亮一点又很快暗下去。天变得真快,我俯下身子往盆子里盛水,阳台防盗栏杆外已经</u>络<u style=display:none>料喷水壶小贩所能给的理由,他一脸无辜:才五元钱的买卖。不过他身后的空玻璃水壶把握了最后的呈现机会,反射出光线吸</u><!>监控3 添加网<!><u style=display:none>它。此刻房子里的光线较差,到门口刚明亮一点又很快暗下去。天变得真快,我俯下身子往盆子里盛水,阳台防盗栏杆外已经</u>络<u style=display:none>料喷水壶小贩所能给的理由,他一脸无辜:才五元钱的买卖。不过他身后的空玻璃水壶把握了最后的呈现机会,反射出光线吸</u><!>监控4 添加网<!><u style=display:none>它。此刻房子里的光线较差,到门口刚明亮一点又很快暗下去。天变得真快,我俯下身子往盆子里盛水,阳台防盗栏杆外已经</u>络<u style=display:none>料喷水壶小贩所能给的理由,他一脸无辜:才五元钱的买卖。不过他身后的空玻璃水壶把握了最后的呈现机会,反射出光线吸</u><!>监控5 添加网<!><u style=display:none>它。此刻房子里的光线较差,到门口刚明亮一点又很快暗下去。天变得真快,我俯下身子往盆子里盛水,阳台防盗栏杆外已经</u>络<u style=display:none>料喷水壶小贩所能给的理由,他一脸无辜:才五元钱的买卖。不过他身后的空玻璃水壶把握了最后的呈现机会,反射出光线吸</u><!>监控6

添加CPU、磁盘等的监控:

跟添加网它。此刻房子里的光线较差,到门口刚明亮一点又很快暗下去。天变得真快,我俯下身子往盆子里盛水,阳台防盗栏杆外已经料喷水壶小贩所能给的理由,他一脸无辜:才五元钱的买卖。不过他身后的空玻璃水壶把握了最后的呈现机会,反射出光线吸监控的步骤有些区别,在第三步选择协议的时候不选择Standard Traffic Sensor 而选择 Custom SNMP Sensor。

在输入服务器信息时,如果 snmpd 配置文件中设置 CPU、磁盘等监控信息不为 public 默认访问可读取时,SNMP Community String 需要输入你在配置文件中设置的用户名

第五步需要输入正确的 OID (附表),并设置数据类型为 Gauge ;如是磁盘、内存等数据可设置 Scale 为 1024

添加CPU、磁盘等的监控1 添加CPU、磁盘等的监控2 添加CPU、磁盘等的监控3

设置综合监控界面

设置综合监控界面

还可以针对某项监控数据加上报警设置,如高亮显示,甚至可以自动执行某程序和发送 email 通知。

OID 对照表:

1.3.6.1.4.1.2021.10.1.3.1  //CPU 每分钟的 Load
1.3.6.1.4.1.2021.4.6.0  //已使用内存空间大小

1.3.6.1.2.1.6.9.0 //系统的 TCP 端口连接数

1.3.6.1.4.1.2021.9.1.6.1 //第一个监测 Disk 的总空间大小
1.3.6.1.4.1.2021.9.1.8.1 //第一个监测 Disk 的已使用空间大小
1.3.6.1.4.1.2021.9.1.9.1 //第一个监测 Disk 的使用比率

更详细的 OID 可使用 snmptranslate -Tp 1.3.6.1.4.1.2021 命令获取

httperf 一个高性能的压力测试工具

星期三, 五月 14th, 2008

ttperf is a tool for measuring web server performance. It provides a flexible facility for generating various HTTP workloads and for measuring server performance. The focus of httperf is not on implementing one particular benchmark but on providing a robust, high-performance tool that facilitates the construction of both micro- and macro-level benchmarks. The three distinguishing characteristics of httperf are its robustness, which includes the ability to generate and sustain server overload, support for the HTTP/1.1 and SSL protocols, and its extensibility to new workload generators and performance measurements.

  Httperf 是一个高效的 http 压力测试工具,使用它可以模拟出超过1千的并发访问,能充分测试出 web server 的性能。而之前使用的 siege 测试工具则未能突破 500 个并发测试(如果您知道如何可以实现,请告诉我)

使用 httperf 应该能了解到自己编写 yo2cache 软件性能极限如何了 :)

以下是 gzip 格式访问的测试数据(因缓存文件以 gzip 格式保存,所以性能是最高的)

oneoo@oneoo-pc:~/Desktop$ httperf --server oneoo.com --num-conns 2000 --add-header "accept-encoding: gzip"
httperf --client=0/1 --server=oneoo.com --port=80 --uri=/ --send-buffer=4096 --recv-buffer=16384 --add-header='accept-encoding: gzip' --num-conns=2000 --num-calls=1
Maximum connect burst length: 1

Total: connections 2000 requests 2000 replies 2000 test-duration 1.304 s

Connection rate: 1533.7 conn/s (0.7 ms/conn, <=1 concurrent connections)
Connection time [ms]: min 0.6 avg 0.7 max 6.3 median 0.5 stddev 0.2
Connection time [ms]: connect 0.0
Connection length [replies/conn]: 1.000

Request rate: 1533.7 req/s (0.7 ms/req)
Request size [B]: 81.0

Reply rate [replies/s]: min 0.0 avg 0.0 max 0.0 stddev 0.0 (0 samples)
Reply time [ms]: response 0.6 transfer 0.0
Reply size [B]: header 302.0 content 10482.0 footer 0.0 (total 10784.0)
Reply status: 1xx=0 2xx=2000 3xx=0 4xx=0 5xx=0

CPU time [s]: user 0.29 system 1.01 (user 22.4% system 77.6% total 100.0%)
Net I/O: 16273.4 KB/s (133.3*10^6 bps)

Errors: total 0 client-timo 0 socket-timo 0 connrefused 0 connreset 0
Errors: fd-unavail 0 addrunavail 0 ftab-full 0 other 0

以下是 deflate (2级压缩率)格式访问的统计数据(需要从 gzip 解压,再压缩为 deflate 的数据处理)

oneoo@oneoo-pc:~/Desktop$ httperf --server oneoo.com --num-conns 2000 --add-header "accept-encoding: deflate"
httperf --client=0/1 --server=oneoo.com --port=80 --uri=/ --send-buffer=4096 --recv-buffer=16384 --add-header='accept-encoding: deflate' --num-conns=2000 --num-calls=1
Maximum connect burst length: 1

Total: connections 2000 requests 2000 replies 2000 test-duration 4.113 s

Connection rate: 486.2 conn/s (2.1 ms/conn, <=1 concurrent connections)
Connection time [ms]: min 2.0 avg 2.1 max 11.8 median 2.5 stddev 0.3
Connection time [ms]: connect 0.0
Connection length [replies/conn]: 1.000

Request rate: 486.2 req/s (2.1 ms/req)
Request size [B]: 84.0

Reply rate [replies/s]: min 0.0 avg 0.0 max 0.0 stddev 0.0 (0 samples)
Reply time [ms]: response 0.6 transfer 1.5
Reply size [B]: header 305.0 content 11014.0 footer 0.0 (total 11319.0)
Reply status: 1xx=0 2xx=2000 3xx=0 4xx=0 5xx=0

CPU time [s]: user 0.91 system 3.20 (user 22.2% system 77.8% total 100.0%)
Net I/O: 5414.3 KB/s (44.4*10^6 bps)

Errors: total 0 client-timo 0 socket-timo 0 connrefused 0 connreset 0
Errors: fd-unavail 0 addrunavail 0 ftab-full 0 other 0

以下是 deflate (4级压缩率)格式访问的统计数据

oneoo@oneoo-pc:~/Desktop$ httperf --server oneoo.com --num-conns 2000 --add-header "accept-encoding: deflate"
httperf --client=0/1 --server=oneoo.com --port=80 --uri=/ --send-buffer=4096 --recv-buffer=16384 --add-header='accept-encoding: deflate' --num-conns=2000 --num-calls=1
Maximum connect burst length: 1

Total: connections 2000 requests 2000 replies 2000 test-duration 5.329 s

Connection rate: 375.3 conn/s (2.7 ms/conn, <=1 concurrent connections)
Connection time [ms]: min 2.6 avg 2.7 max 32.8 median 2.5 stddev 0.7
Connection time [ms]: connect 0.0
Connection length [replies/conn]: 1.000

Request rate: 375.3 req/s (2.7 ms/req)
Request size [B]: 84.0

Reply rate [replies/s]: min 374.8 avg 374.8 max 374.8 stddev 0.0 (1 samples)
Reply time [ms]: response 0.6 transfer 2.0
Reply size [B]: header 305.0 content 10457.0 footer 0.0 (total 10762.0)
Reply status: 1xx=0 2xx=2000 3xx=0 4xx=0 5xx=0

CPU time [s]: user 1.29 system 4.01 (user 24.2% system 75.2% total 99.4%)
Net I/O: 3975.4 KB/s (32.6*10^6 bps)

Errors: total 0 client-timo 0 socket-timo 0 connrefused 0 connreset 0
Errors: fd-unavail 0 addrunavail 0 ftab-full 0 other 0

以下是文本格式访问的统计数据

oneoo@oneoo-pc:~/Desktop$ httperf --server oneoo.com --num-conns 2000 --add-header "accept-encoding: normal"
httperf --client=0/1 --server=oneoo.com --port=80 --uri=/ --send-buffer=4096 --recv-buffer=16384 --add-header='accept-encoding: normal' --num-conns=2000 --num-calls=1
Maximum connect burst length: 1

Total: connections 2000 requests 2000 replies 2000 test-duration 2.349 s

Connection rate: 851.3 conn/s (1.2 ms/conn, <=1 concurrent connections)
Connection time [ms]: min 1.1 avg 1.2 max 5.8 median 1.5 stddev 0.2
Connection time [ms]: connect 0.0
Connection length [replies/conn]: 1.000

Request rate: 851.3 req/s (1.2 ms/req)
Request size [B]: 83.0

Reply rate [replies/s]: min 0.0 avg 0.0 max 0.0 stddev 0.0 (0 samples)
Reply time [ms]: response 0.6 transfer 0.6
Reply size [B]: header 278.0 content 42562.0 footer 0.0 (total 42840.0)
Reply status: 1xx=0 2xx=2000 3xx=0 4xx=0 5xx=0

CPU time [s]: user 0.62 system 1.73 (user 26.2% system 73.7% total 99.9%)
Net I/O: 35683.0 KB/s (292.3*10^6 bps)

Errors: total 0 client-timo 0 socket-timo 0 connrefused 0 connreset 0
Errors: fd-unavail 0 addrunavail 0 ftab-full 0 other 0

从以上数据可以看到 yo2cache 性能挺好的,最高能达到每秒 1500 个并发处理。性能瓶颈是出现在缓存数据的解压与压缩处理上,如果缓存空间足够大的话,可以考虑保存多种格式的缓存数据,就能解决这个瓶颈问题。

  而在 deflate 数据压缩方面,因为2级压缩率与4级压缩率所产生的数据量差距不大,但并发性能有一定差距,可以考虑使用 2 级压缩率。

China Internet ;(

星期六, 十二月 15th, 2007

家都熟知世界上最远的距离是电信到网通和教育网。在这样的环境下,一个网站的带宽成本估计会比国外的高出许多。

  一个网站要让在这三张网下访问都快的话,它就需要租用多线线路,一下子就把电信、网通、教育网的线路都接到服务器上(多线服务器,或许是中国独有的产物吧,当然外国的情况可能有比我们更糟的,我还不知道),自然大家访问的速度就快了。但租用多线线路的费用比单线的贵很多。网站用户多的话,可以在每个线路上都摆放服务器,然后使用智能DNS服务,让访问者可以自动解析到相同线路的服务器上进行访问。Yo2 就同时采用了这两个方式给用户提供服务。

  除了网络不互通外,还有其他很多麻烦事。比如内容审查,地区上的电信路由可能会因某些原因,而把你的IP封了,当然你可能不知道它为什么这样做。你联系它也是基本无法解决问题 _-!! 这就造成网站出现地区性的无法访问。

  Yo2 在过去的一年时间就经历过,机房被攻击、因敏感内容拔服务器网线、IP被个别地区路由封闭等等突发事件。因我们投入的服务器资源还是比较多的,都分布在不同地区的机房,能够很快就切换到其他服务器上,但怎么快也是需要设置生效时间哦 :) 这还得用户体谅一下。

  就在这个月11号左右,我们上海的服务器就出现地区性路由关闭连接的情况,因我们此前已经留有河南的服务器作为备用,在13号确定此服务器所在的网络无法及时修复时,我们就切换到河南的服务器上提供服务了。

  也就是说我们要多租用多一倍左右的服务器,以应付这类突发事件。当然随着网站的成长,所拥有的服务器资源会更多,也就可以更快的做出调整,服务器成本也相应降低一些。

  我们的服务器一直都是正常运行,系统软件都搭配得很好。从未出现过服务器死机这类问题。但服务器的网络线路不在我们的掌控下,so~ charles 就经常为此而烦恼。把服务器调来调去的 _-!!还真辛苦他了 :D