《构建高性能Web站点》笔记:3.3 系统调用对性能的影响
系统调用 a.有些高级的操作需要进行系统调用,比如获取当前时间、读写文件等 b.进行这些操作前,进程会先从用户态转入内核态,执行完后再转回来 c.这种转换是有一定开销的,所以要尽量避免不必要的系统调用 可以用strace -pid 来监视进程的系统调用 (如果进程代码是gcc编译的并且使用了static选项,则可以得到更简洁的输出)
系统调用 a.有些高级的操作需要进行系统调用,比如获取当前时间、读写文件等 b.进行这些操作前,进程会先从用户态转入内核态,执行完后再转回来 c.这种转换是有一定开销的,所以要尽量避免不必要的系统调用 可以用strace -pid 来监视进程的系统调用 (如果进程代码是gcc编译的并且使用了static选项,则可以得到更简洁的输出)
长连接(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命令查看连接的端口号是不是一直在变
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
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 …
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请求的总体响应时间=客户端到服务器的数据传输时间 + 服务器计算处理时间 +服务器到客户端的数据传输时间 + 浏览器本地渲染和计算时间 优化的对象: 瓶颈, 以及多个非关键因素(它们叠加起来产生的性能影响可能也不小)
带宽的概念 宽带的限速: 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:查看数据包经过的每一个路由节点
各项指标: 1. 吞吐率(throughput),它和qps是同义词,即每秒钟可以处理的请求数 2. 最大并发数:服务器在同一瞬间可以服务的最大请求数。见这里。 3. 服务器处理每个请求的平均时间 4. 用户等待请求完成的平均时间 指标的查看: 1. apache的 mod_status模块可以查看qps 2. mod_status也可以查看当前并发数 3. 最大并发数则可以通过 apache ab这个软件进行压力测试测出来 4. apache ab还可以在压测时查看“服务器处理每个请求的平均时间”和”用户等待请求完成的平均时间”及其它性能指标。
常见性能测试指标 1.Avg Rps和90% Rps 2.TPS, RPS 3.Error发生率 4.Throughput每秒 5.服务器负载:CPU,MEM,IO,NET 可以重点说下Linux服务器的CPU指标(从某次培训中听来的) 1.CPU的时间分解 a.用户态占比 b.内核态占比 c.io请求等待时间 d.cpu空闲占比 2.其它CPU指标 a.cpu load (线程队列长度) b.上下文切换 (I/O容易产生上下文切换,这是因为I/O时容易产生等待,一等待就会CPU就会被其它进程抢占,产生上下文切换)
《构建高性能Web站点》 http://product.china-pub.com/195907 目录回到顶部↑ 第1章 绪论. 1 1.1 等待的真相 1 1.2 瓶颈在哪里 2 1.3 增加带宽 3 1.4 减少网页中的http请求 4 1.5 加快服务器脚本计算速度 4 1.6 使用动态内容缓存 5 1.7 使用数据缓存 5 1.8 将动态内容静态化 6 1.9 更换web服务器软件 6 1.10 页面组件分离 7 1.11 合理部署服务器 7 1.12 使用负载均衡 8 1.13 优化数据库 8 1.14 考虑可扩展性 9 1.15 减少视觉等待 10 第2章 数据的网络传输 11 2.1 …