大家都知道。
在设计一个系统时,最重要的非功能质量就是高性能。
但是
你设计一个低性能的系统时也要考虑硬件和中间件的具体情况吧。
有多少流量,需要多少硬件,都需要在开发前认真考虑
而不是仅凭感觉去确认
硬件少了,造成业务流量瓶颈
硬件多了,造成运算的冗余。
下面的数据能够帮助大家更好的在系统设计,功能开发中有效对性能进行评估。
首先明确的是,这个系统一定要可拓展。
针对流量的可拓展。
假设当前设计的业务系统当前用户日访问量在w,
当时突然有一天用户量激增到0w
这时候代码改动应该是极少的
而应该对硬件进行拓展。
在面临这种情况下,了解硬件的具体性能至关重要。
以下标准使用PCX86桌面机器的经验。
不代表线上生产机器的数据,仅供参考。
下面分为应用层和系统层分别介绍
常用应用层性能指标参考标准
通用标准
容量按照峰值的5倍冗余计算
第三方查询接口吞吐量为/s
单条数据库记录占用大约1kb的空间(少整些大字段)
Mysql
单端口读:0/s
单端口写:/s
单表容量:万条
Redis
单端口读:/s
单端口写:/s
单端口内存容量:32GB
KafKa
单机读:/s
单机写:/s
DB2
单机读峰值:/s
单机写峰值:/s
单表容量:1亿条数据
常用的系统层性能指标参考标准
寄存器和内存
寄存器、L2、L3、内存、分支预测失败、互斥量加锁和解锁等耗时为纳秒级别。
内存随机读取可达30万次/s,顺序读取可达万次/s。
内存每秒可以读取GB基本的数据。
读取内存中1MB的数据为ns,为亚毫秒级。
硬盘I/O
普通的SATA机械硬盘IOPS能达到次/s。
普通的SATA机械硬盘顺序读取数据可达M/s。
普通的SATA机械硬盘随机读取数据可达2M/s。
普通的SATA机械硬盘旋转半圈需要3ms。
普通的SATA机械硬盘寻道需要3ms。
普通的SATA机械硬盘在已经寻道后(找到了要读取的磁道,也找到了要读取的扇区),开始读取数据,读取一次数据真正的耗时为2ms。
FusionIO卡(一种高的SSD硬盘套件)可达百万级别的IOPS。
高端机器如IBM,华为等服务器配上高端的存储设备,可以达到每秒GB级别的数据读取,相当于普通内存的读取速度。
固态硬盘访问延迟:0.1~0.2ms,为亚毫秒级别,和内存速度差不多。
网络I/O
常见的千兆网卡的传输速度为0Mbit/s,即Mbit/s。
千兆网卡读取1MB数据:10ms。
数据库
读写数据库中的一条记录在毫秒级别,短则几毫秒,多则几百毫秒,大于ms一般认为超时。
Mysql在4核心,GB内存的机器配置中性价比最好,继续垂直拓展由于体系结构的限制,成本开始增加,提升的性能开始减少,性价比开始降低。
IDC
同一计方网络来回:0.5ms。
异地计方来回:30-ms。
同一机房的RPC服务调用为几个毫秒,有的为几十毫秒或者几百毫秒,一般设置ms以上为超时。
网络
网页加载为秒级别
UV:每日一共有多少用户来访,用CookieSession跟踪。
独立IP访问:每日有多少独立IP来访,同一局域网可看到同一个IP。
PV:每日单独用户的所有页面访问量。如果每日UV为万,那么每秒的平均在线人数为000/24/60/60=人,还要知道这一秒内每个用户都在做什么,如果每秒内都在做一次查询操作,那么需要有一个能承受/s吞吐量的机器。
某社交媒体平台每秒的写入量上万,每秒请求量上百万,每天登录的用户上亿,每天产生的数据量上千亿。
组合计算和估算
普通的SATA机器硬盘一次随机读取的时间为:3ms(磁盘旋转)+3ms(寻道)+2ms(存储的数据延迟)=8ms。
普通的SATA机器硬盘每秒随机读取:0ms/8ms=次IOPS。
IOPS代表磁盘每秒可随机寻址多少次,随机读取速度取决于数据是如何存放的,如果数据按块存放,每块4kb,每秒读取10块,那么随机读取速度为10*4KB*次/s=5M/s。
一次读取内存的时间:0ms/30万次/s=3ns
CPU速度=10倍*内存速度=倍*I/O速度
顺序读取普通SATA机械硬盘1MB的数据:20ms
请记住:2的10次幂=1KB,2的20次幂=1MB,2的30次幂=1GB,2的32次幂=4GB
主要的性能指标就这些。
当你设计系统时要注意。
开发功能时也要注意。
进行框架设计时更要注意。
如何在满足需求于硬件成本上要做好均衡。
以上只是告诉大家一个大概的性能评估的方向
不要照搬,不要照搬,不要照搬
不同配置性能不同。
中间件不同配置性能不同。
一切已实际为准。
以及上面未提到的RabbitMq的速度,ES的速度,MonogoDB的速度,都需要结合具体硬件与应用配置来进行确认。
祝大家的系统越来越快。