计算机相关,性能开销,统计数据集锦

1. 在 Java™ 和 PHP 这类语言中,每个连接都会生成一个新线程,每个新线程可能需要 2 MB 的配套内存。在一个拥有 8 GB RAM 的系统上,理论上最大的并发连接数量是 4,000 个用户。随着您的客户群的增长,如果希望您的 Web 应用程序支持更多用户,那么,您必须添加更多服务器。当然,这会增加服务器成本、流量成本和人工成本等成本。除这些成本上升外,还有一个潜在技术问题,即用户可能针对每个请求使用不同的服务器,因此,任何共享资源都必须在所有服务器之间共享。鉴于上述所有原因,整个 Web 应用程序架构(包括流量、处理器速度和内存速度)中的瓶颈是:服务器能够处理的并发连接的最大数量。

(http://www.ibm.com/developerworks/cn/opensource/os-nodejs/index.html?ca=drs)

PS: 

Node 公开宣称的目标是 “旨在提供一种简单的构建可伸缩网络程序的方法”,Node 解决这个问题的方法是:更改连接到服务器的方式。每个连接发射一个在 Node 引擎的进程中运行的事件,而不是为每个连接生成一个新的 OS 线程(并为其分配一些配套内存)。Node 声称它绝不会死锁,因为它根本不允许使用锁,它不会直接阻塞 I/O 调用。Node 还宣称,运行它的服务器能支持数万个并发连接。

现在您有了一个能处理数万个并发连接的程序,那么您能通过 Node 实际构建什么呢?如果您有一个 Web 应用程序需要处理这么多连接,那将是一件很 “恐怖” 的事!那是一种 “如果您有这个问题,那么它根本不是问题” 的问题。在回答上面的问题之前,我们先看看 Node 的工作原理以及它的设计运行方式。


--------------------------------------------------------------------------------


2. 在不改动代码与SQL语句的前提下,如何去改善和提高web server与app server的性能,千万不要小觑这一内容,它可以让你在不改动代码的情况下得到10-20倍以上的性能提高,网上有其它的大牛们写过一篇文章叫“Tomcat如何支持到1000个用户”,经过几个重大工程的实践,Opensource的Tomcat如果调优的好不只可以支持者1000个用户,尤其当你的布署环境是64位操作系统的情况下,可能能够支持更大更高的并发性能,(http://blog.csdn.net/lifetragedy/article/details/7707455)


--------------------------------------------------------------------------------


3.

典型PC系统各种操作指令的大概时间

fetch from L1 cache memory

从一级缓存中读取数据

0.5 nanosec

execute typical instruction

执行基本指令

1 nanosec

branch misprediction

分支误预测

5 nanosec

fetch from L2 cache memory

从二级缓存获取数据

7 nanosec

Mutex lock/unlock

互斥加锁/解锁

25 nanosec

fetch from main memory

从主内存获取数据

100 nanosec

send 2K bytes over 1Gbps network

通过1G bps 的网络发送2K字节

20us (20, 000 nanosec)

read 1MB sequentially from memory

从内存中顺序读取1MB数据

250us (250, 000 nanosec)

fetch from new disk location (seek)

从新的磁盘位置获取数据(随机读取)

8ms (8, 000, 000 nanosec)

read 1MB sequentially from disk

从磁盘中顺序读取1MB数据

20ms (20, 000, 000 nanosec)

send packet US to Europe and back

从美国发送一个报文包到欧洲再返回

150ms (150, 000, 000 nanosec)



--------------------------------------------------------------------------------


4.

谷歌数据:网页加载超过4秒,25%人会放弃;手机网页超过10秒,50%用户会放弃,60%人不再返回;Google搜索结果慢0.4秒,一天搜索量减少800万次;40%移动购物者会放弃加载时间超过3秒的网站;亚马逊每天销售额约6700万美元,网页延迟1秒可导致全年损失16亿美元


--------------------------------------------------------------------------------


5. 软件开发中常见的十大系统瓶颈

5.1 数据库
工作任务内存超过可用的RAM内存
长/短查询
写入冲突
大连接(join)占用内存


5.2 虚拟化
共享一个HDD、磁盘寻死(disk seek death)
在云端网络I/O波动


5.3 编程
线程:死锁、调试、非线性扩展等
事件驱动编程:callback()过于复杂、如何在函数调用中存储有状态等
缺乏调优、跟踪、日志等
单模块不可扩展、单点故障(SPOF:Single Point Of Failure)、非横向扩展等
有状态应用程序
设计问题:开发的应用程序只在自己的机器行运行正常,或者只是在几个人测试的时候正常(没有经历压力测试)。
算法过于复杂
相关服务,例如DNS查找以及其他可能屏蔽的服务
堆栈空间


5.4 磁盘
访问本地磁盘
随机访问磁盘I/O
磁盘碎片
当SSD写入的数据大于SSD容量时,性能会下降


5.5 OS
Fsync饱和,Linux缓冲区填塞(Fsync flushing, linux buffer cache filling up)
TCP缓冲区太小
文件描述符限制
功率分配(Power budget)


5.6 缓存
没使用memcached(数据库崩溃)
HTTP中:headers、etags、没有使用gzip压缩等。
没有充分利用浏览器缓存
字节码缓存(如PHP)
L1/L2缓存:这是个令人头疼的大瓶颈。把关键并且经常访问的数据存储在L1/L2中。这涉及到很多:snappy网络I/O,列数据库直接在压缩数据上运行算法等。利用一些技术不销毁你的TLB。最重要的思想是紧紧的抓住计算机的体系结构,涉及多核CPU,L1/L2,共享的L3,NUMA RAM,从DRAM到芯片数据传输带宽/延迟,DRAM缓存的DiskPages,DirtyPages,流经CPU<->DRAM<->NIC的TCP包。


5.7 CPU
CPU过载
内容切换—>单核上开启的线程过多、Linux调度器、系统调用太多等
IO等待—>所有的CPU在同速等待
CPU缓存:缓存数据是一个细粒度进程,为了在多个实例与不同的值数据之间找到正确的平衡,来保持缓存数据的一致性和繁重同步。
底板吞吐量(Backplane throughput)


5.8 网络
NIC刷爆、IRQ饱和、软中断占用掉了100%CPU
DNS查询
数据包丢失
网络中存在预期外的路由
访问网络磁盘
共享SAN
服务器故障—>无法从服务处得到响应


5.9 进程
测试时间
开发时间
团队规模
预算
代码债务


5.10 内存
内存不足—>杀死进程,切换到swap,挂起
内存不足导致磁盘交换(与swap相关)
记忆库开销过大(Memory library overhead)
内存分片(在Java中需要会因为内存回收而停顿;在C中,malloc总是开始分配内存)


--------------------------------------------------------------------------------



原文地址:https://www.cnblogs.com/leonxyzh/p/7289185.html