Month: March 2012

《构建高性能Web站点》笔记:4.1 动态内容缓存

动态html缓存是指 将动态的内容如 detial?id=xxx 缓存起来,存成文件; 当收到同样的请求时,直接返回缓存的文件,而不必再去执行一次完整的请求处理过程,比如查数据库什么的。 缓存除了放文件里,还可以放内存里,或者一台独立的缓存服务器中。 具体实现的方案包括:   1. web/mvc框架:如php的smarty,它提供了缓存操作的API   2. web服务器:如apache的mod_cache,它根据http头里的一些字段来决定缓存的刷新策略 (在这里,缓存的key是url)   #2比#1的代码侵入性要低的多、甚至可以说没有侵入; 但反过来说,这也意味着缓存的设计依赖了web server,并且应用程序对缓存失去了直接控制 前端 另一个重要的缓存点是动态脚本编译后的opcode,如jsp编译后的字节码。 将opcode缓存起来,可以避免每次请求时都编译一次   1.php/jsp都可以玩这一套,其中jsp还可以pre-compile   2.这种缓存只能节省CPU/内存的开销,跟I/O没什么关系; 如果你的应用的瓶颈是在I/O,那这种做法就没什么效果

java.util.List与null对象

List list = new ArrayList(); System.out.println(list.size()); // 0 System.out.println(list.isEmpty()); // 1 System.out.println(list.get(0)); // java.lang.IndexOutOfBoundsException list.add(null); System.out.println(list.size()); // 1 System.out.println(list.isEmpty()); // false System.out.println(list.get(0)); // null

《构建高性能Web站点》笔记:3.5 I/O

I/O    1.内存I/O一般不是瓶颈,网络I/O和磁盘I/O才是关键       2.提升网络性能:独享高带宽,高速网卡    3.提高磁盘性能:使用RAID,并行读写    4.不管用多好的外设,I/O都仍要走系统调用的路子。系统调用会产生开销,而且CPU还是经常要等待。因此,有些机器设计了一些不走cpu的技术,如DMA: 不通过CPU,而让DMA控制器直接进行磁盘和内存的数据交换; 这样虽然不能提升I/O速率,但可以节省CPU资源 以下我还不太懂,需要研究一下linux操作系统原理才好说。这里先记下一些关键字    1. 阻塞式I/O,非阻塞式I/O ?    2. 内存映射: 建立内存与磁盘的映射关系,写到内存的东西会同步到磁盘上    3. 直接I/O: 不使用内核缓冲区(内存与磁盘间的一个缓存),而是程序自己建立一个用户态的缓冲区,以实现自己想要的缓存策略    4. sendfile:把数据从磁盘读到写给网卡时,不使用内核缓冲区和内存,而是直接将磁盘数据发给socket;这对静态文件的获取很有帮助    5. 异步I/O

《构建高性能Web站点》笔记:3.4 长连接(Keep-Alive)

长连接(Keep-Alive)    1.连接一下(tcp),陆续发送多份数据,然后才断开连接,这就是长连接;短连接则是发一下连一下    2.建立连接本身有一定的开销,通过长连接减少连接次数,有利于性能的提升    3.http 1.1支持长连接,同时,它需要浏览器和web服务器的共同协作    4.浏览器发送的Connection: Keep-Alive意思就是让服务器在可能的情况下使用长连接,即重用一个连接进行多次请求    5. Apache 2.2.11中默认支持长连接    6. 长连接有个超时机制,一旦超时就断开连接; 浏览器和web服务器一般都可以设置    7. 长连接也有缺点:如果长连接超时时间过长,数据传完了,服务器还仍然维护一个空的连接,即空的进程,这会导致资源浪费。 Q: 如何查看当前服务器是否使用了长连接? A: [某高手说的] 可以用netstat命令查看连接的端口号是不是一直在变

《构建高性能Web站点》笔记:3.3 系统调用对性能的影响

系统调用    a.有些高级的操作需要进行系统调用,比如获取当前时间、读写文件等    b.进行这些操作前,进程会先从用户态转入内核态,执行完后再转回来    c.这种转换是有一定开销的,所以要尽量避免不必要的系统调用 可以用strace -pid 来监视进程的系统调用 (如果进程代码是gcc编译的并且使用了static选项,则可以得到更简洁的输出)

《构建高性能Web站点》笔记:3.2 linux进程与性能

1. 进程:     a. 如果过于频繁地调用fork()来创建进程,可能会产生性能问题    b. 每个进程都有自己的地址空间和上下文信息,大量进程会导致大量的内存消耗,从而影响性能   c. 频繁切换进程,也会造成开销    d. 线程的上下文切换的开销比进程的切换开销小得多,而且一个进程之间的多个线程之间可以共享进程的地址空间和上下文,节省不少内存。    e. linux下的线程有两种:       i.用户态的线程。它的切换开销比较小,但在“多处理器的服务器”中表现不好      ii.内核级的线程。一个线程对应一个linux的“轻量级进程”,它对“多处理器的服务器”的支持较好,但切换的开销较大   2.进程调度    a. Scheduler会维护不同状态的进程队列    b. 进程可以告诉scheduler它想要要的优先级,但最终的优先级由scheduler决定    c. 进程切换:主要动作是把寄存器里的东西压栈到内存中,然后把另一个进程的东西装入到寄存器中   d. 系统指标有: load, priority   3.进程调度的监控    a. top一下,看pr和ni, 前者代表priority,越低的优先级越高;后面是nice的缩写,代表优先级将要发生的变化,即 pr_new = pr_old + ni; 如果进程的ni值是正数,则表示它愿意降低自己的优先级,让出cpu时间片,也就是说它很nice;    b. 看load: cat /proc/loadavg 或 top 或w ; …

《构建高性能Web站点》笔记:3.2 linux进程与性能 Read More »

apache ab的使用

Apache ab是一款性能测试工具,用于测量服务器处理请求的时间。 LoadRunner/Jmeter等工具是站在用户的角度来测试的,测出的时间里会包含网络和浏览器的处理时间。 而Apache ab可以直接在服务器上测试,测出的时间里不包含网络和浏览器的成份,针对性很强。 用法:   ab -n500 -c100  http://localhost/hello.php   #-n1000代表执行500次请求,-c100代表100个并发     测试结果解释: Time taken for tests:   12.515 seconds  #总耗时 Requests per second:    39.95 [#/sec] (mean) #qps Time per request:       2503.048 [ms] (mean) #用户眼中的请求完成的平均时间 Time per request:       25.030 [ms] (mean, across all concurrent requests)      #服务器处理每个请求的平均时间=用户等待请求完成的平均时间/并发数 Transfer rate:          1243.87 [Kbytes/sec] received #数据传输速率,可用于规划带宽 Percentage of …

apache ab的使用 Read More »

《构建高性能Web站点》笔记:3.1 服务器的性能指标

各项指标: 1. 吞吐率(throughput),它和qps是同义词,即每秒钟可以处理的请求数 2. 最大并发数:服务器在同一瞬间可以服务的最大请求数。见这里。 3. 服务器处理每个请求的平均时间 4. 用户等待请求完成的平均时间 指标的查看: 1. apache的 mod_status模块可以查看qps 2. mod_status也可以查看当前并发数 3. 最大并发数则可以通过 apache ab这个软件进行压力测试测出来 4. apache ab还可以在压测时查看“服务器处理每个请求的平均时间”和”用户等待请求完成的平均时间”及其它性能指标。

《构建高性能Web站点》笔记:2. 带宽

带宽的概念 宽带的限速: IDC会在基础交换机上设置关卡,限制数据从你的主机流入IDC交换结点转发队列的速度 搞清楚什么叫独享10M带宽: 假设IDC路由器出口带宽为100M,你要保证同一个交换机上的其他主机的数据传输速率总和不超过90M,你才能独享10M带宽。 比如说,路由器的带宽为100M,交换机上接了50台机器,并给每个机器限速10M;如果50台机中只有一台机器在运行,那这台机以满速10M来传输数据时,交换机不会阻拦,因为路由器吃得消;如果50台机全部在运行并试图以满速运行,即交换机被要求以50M*10=500M的速率把数据发送到路由器,那路由器就会告诉交换机它吃不下500M,只能吃100M,交换机因此也会告诉机器,它只能吃下100M,请每台机最大2M的速率向我发送数据,而每台主机也会合作,因为这是底层网络协议的实现。 解决网络的瓶颈:主要办法就是找到带宽较低的线路; 比如说,运营商出于各自的利益考虑,在互联互通方面很不给力,也就是说不愿意建设高速的互联宽带 (两条高速公路通过两根木板搭起来连接),这种情况下,你的服务器最好使用双线:同时直连联通和电信 工具: 1. MRTG: 可以生成网卡流量报告单,可以查看实时流量 2. Nmon: 可以查看实时流量 3. traceroute:查看数据包经过的每一个路由节点

《构建高性能Web站点》笔记:1. 绪论

web请求的总体响应时间=客户端到服务器的数据传输时间 + 服务器计算处理时间 +服务器到客户端的数据传输时间 + 浏览器本地渲染和计算时间 优化的对象: 瓶颈, 以及多个非关键因素(它们叠加起来产生的性能影响可能也不小)