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

带宽的概念

网络带宽“在口语中用来表示 信道容量,信道容量是 系统能够传输数据位的速度”(wikipedia) 常见的误解是把它当成比特位在线路中跑的速度,以为带宽越大,比特位跑的就越快 实际上,比特位在宽带上跑的速度跟在窄带上跑的速度是一样大的;如果把线路比喻成一车道的公路的话,比特位就是汽车,汽车在宽带这条路上的行驶速率跟汽车在窄带路上的 行驶速率是一样的,但是宽带路上各车之间的车距比较小,单位时间内可以通过的汽车比较多(谢希仁): 更确切一点地说, 宽带并不是高速公路,而是高速公路的入口(郭欣);带宽越高,意味着高速入口的吞吐越快。 带宽其实是 数据块从结点进入到传输媒体的速度 (谢希仁) 而所谓的高速公路的速率,对应的则是比特位单位时间内在介质中传播的距离;一般可视为 2* 10^8米/秒 如果考虑真实的硬件设备,带宽又是怎么一回事呢? 比如说, 百兆网卡,连接到千兆交换机,那整体的传输数率是多少呢? 答案是:取最小的那个值,即100Mb/s 当然,还应该考虑网线的带宽。如果网线带宽只有1M,则整体传输速率就降为1M了 (谈到网线的带宽时,不要去想高速公路的事情,否则会糊涂)。网线的带宽取决于材质(光纤比铜线好),以及一根网线是由多少细线组成的 最后,我们讨论一下,在已知带宽、传输距离的情况下,用户从一个网站下载一个东西到底要多长时间。   解这套题要套这个公式:   总时间 = 数据块从结点进入到传输媒体的时间 + 信号在介质中传播的时间 + 交换结点的处理、排队时间 如果网站服务器的接入带宽是100M, 用户PC的接入带宽是10M, PC和服务器在同一张桌子上(传输距离忽略不计),且PC直连服务器;要下载的文件大小是1G(约1000MB),则 总时间 = 数据块从结点进入到传输媒体的时间 + 信号在介质中传播的时间 + 交换结点的处理、排队时间 = 数据块从结点进入到传输媒体的时间 + 0m/传播速率 + 0 = 数据块从结点进入到传输媒体的时间 = 数据块大小/整体带宽 = 1000MB/min(100M, 10M)b/s = …

带宽的概念 Read More »