服务器性能参数学习与总结


总体说明

在不考虑奸商和回扣的的情况下:
同时间段购买的机器, 价钱越高,配置越高,机器的性能越好.
其实服务器与PC机器一样, 高性能往往意味着高价格.
在购买成套的机器的情况下低价格想要有高性能几乎不可能.

但是不同服务器的侧重点有所不同,需要进行考虑与选型.

计算机组成原理

现代冯诺依曼架构的服务器主要有如下五部分:
输入设备, 输出设备
计算器,控制器
存储器

需要说明的是 广义意义上的 输入输出设备 还包含像是硬盘这样的设备.

存储器包含 CPU的一二三级缓存. 主存等部分.
所以性能提升至少要从三部分开始考虑:
CPU, 内存, 硬盘

第一部分 CPU


CPU性能

简单来讲:
CPU的性能可以根据场上以及型号进行简单的判断.
现在还的CPU厂商主要有:Intel AMD IBM 飞腾 鲲鹏 龙芯 海光 等.
Intel 和 AMD 是最先进的x86架构处理器.

Intel最新的服务器CPU是至强可扩展第三代
分为 铜牌, 银牌, 金牌, 铂金
型号一般为 8358
第一位数字表示 级别.
第二位数字表示 代数
第三四位数字表示 具体的SKU

CPU性能

服务器性能参数学习与总结_数据库


CPU的性能

AMD的命令与Intel的CPU 有一些差异, 需要注意的是,现阶段大部分在售都是Intel的服务器
AMD的服务器多见于云服务厂商.

服务器性能参数学习与总结_数据库_02


影响CPU性能的参数

上一节讲解了CPU的代数与命名
但是并不是新一代的一定比旧一代的CPU性能好
也不是同一代里面编号开头大的一点比小开头的性能好.
还有一些关键的核心参数(不限于):

CPU主频和核数.
CPU高速缓存.
CPU的内存通道数,PCI-E等通道数.
CPU支持的内存频率
其他:
流水线深度
超标量处理器的指令发射数.
指令的类型(RISC和CISC)
多级缓存的速度与包含模式.
TLB等访存组件的大小以及性能.
寄存器的多少与容量.

影响CPU的性能参数

其他条件基本一致的情况下:
产品未涉及GPU计算等需求时:
主频*核数 基本上决定了CPU的整体性能.

建议使用这两个数的乘积 再乘以 CPU的路数来计算最大的CPU计算性能.
需要注意:
CPU的路数越多 CPU之间的信息通信的损耗就越多, 并不能严格的线性增长.
可以作为大体计算, 但是不能用于摸高验证.

CPU的指令集其实是非常复杂的. 包括uos的一些类似于RISC的优化设置.以及很多类似于
AVX-512等CPU指令集, 其实是能在某些场景下很好的来提高产品的性能的.
还比如一些硬件加解密模块,比如HTTPS使用的一些, 如果硬件实现,比软件实现的效率高很多
这也就是为什么一些国产CPU在安全场景下比国外大厂的CPU性能要差一些的一些原因.

影响CPU的性能参数

CPU的流水线最近基本上趋于一致了. 一般都是 14-16级流水线.
流水线太低和太高都各有优缺点.
太低了不利于提高主频, 太高了流水线之间的延迟占用率会更多
两者太极端都不利于提高性能.

现阶段都是超标量的处理器, 通过指令decoder 多发射的方式来提高性能.
但是因为指令之间需要有先后关系. 所以有时候超标量流水线需要停顿来保证数据准确.
所以CPU的极限速度并不是超标量的发射数的倍数关系.

乱序执行 out of order execution.
与超标量对应的,CPU会decoder解析命令,然后将CISC的指令解析为uos,便于调度和减少
占用流水线的单元时间, 提高主频.
但是乱序可能会导致产品出现一些一致性的问题, 所以JAVA开发就会有volatile等参数
实现内存屏障避免数据被错误的并发修改.

影响CPU的性能参数

缓存容量以及TLB,寄存器等的数量和容量

因为程序运行是有时间局限性和空间局限性.
所以可以使用较小容量的高速缓存来提高程序的性能.

需要说明, CPU的时钟周期以及远远大于内存的工作频率,内存是无法喂饱CPU的.
一级缓存一般是2-4时钟周期. 二级缓存 6-12 三级缓存 12-40
内存的话一般需要至少40-100的时钟周期.

所以高速缓存能够极大的提高性能.
还需要注意的是 缓存命中率的关系. 命中率越高,性能越好. cache miss的话会有IO惩罚
性能会急剧降低.

现在操作系统都是 段页式内存管理.
段式管理主要适用于不通内存的类型进行管理, 比如文本区,命令区,堆区,栈区,mmap映射区等.
页式内存管理是用来提高访存速度.
为了提高内存访存效率,高级别的页一般都缓存到CPU内部的TLB中, 他能够决定访问的很大一部分的性能.

寄存器如果太少, 在超线程或者是一些复杂指令时可能就无法有效的并发执行,会导致性能衰退.

影响CPU的性能参数

其他参数:
NUMA
功耗
睿频
温度以及散热能力
操作系统的优化.

第二部分 内存相关


影响内存的性能参数

最重要的参数, 容量+带宽(频率*通道)
内存最重要的参数就是容量. 容量越大能够存到内存里的内容越多
访问硬盘的次数就会越少性能越高.

但是内存大小仅仅是内存的一个参数,还有一些其他很重要的参数

内存频率也是一个比较重要的参数.
需要注意的是内存的工作频率一般只有 100Mhz 133Mhz 以及 166Mhz
因为DRAM 有一个 预充电的动作,无法将工作频率提高的更高.
想对应的 DRAM有一个等效频率. 从最开始的DDR 400 到现在DDR3 2933
以及最高的DDR5 6400

需要注意的是内存的等效频率一般可以通过 乘以8 来计算的对应的内存带宽
比如DDR 400的内存带宽就是3.2GB/s

CPU的计算能力其实可以根据上面CPU章节里面的总Ghz数 简单的乘以8bytes来计算
比如2路10核2.0Ghz的 带宽就至少为 2*10*2*8=320GB/s
当然这里没有考虑MIMD以及一些更高级别的指令.

还需要注意的是通道数:
如果通道数都插满的话 内存的带宽*通道数 就是内存能够提供的总体带宽.

影响内存的性能参数

内存时延

上一节里面简单讲了下 DRAM是需要预充电的
并且是需要有行列转换以及寻址的, 所以其实内存是有较高的时延的
一般有四组数字来计算
但是需要注意的是 这四组数字是没有跟工作频率挂钩,但是却与等效频率来挂钩.
所以除去上一节内存的两大参数. 最大的影响CPU的参数就是时延

CL-TRCD-TRP-TRAS
一般情况下 同频内存, 数字越低性能越好
不同频无法直接比较, 需要进行换算.

影响内存的性能参数

其他方面
内存的条数,通道是否插满
内存的体质.
内粗的品牌.
CPU的NUMA的内存分配.
操作系统和数据库针对NUMA的绑定.
进程的绑定NUMA节点等.

CPU和内存的互相作用

CPU和内存是相辅相成的. 如果内存不够, 会出现大量的SWAP换页操作,导致CPU使用量上升.
表现为: SYS内核CPU时间占比升高, USER用户态CPU时间占用较低, 无法实现最佳业务性能.
内存的带宽和吞吐量也会影响CPU的表现, 现阶段服务器大部分都是多通道内存控制器的.
如果内存仅插了一部分, 可能无法提供最佳CPU性能, 因为CPU处于一个饥饿的状态.

内存的等效频率也有较高的影响, 如果等效频率低, 会导致CPU出现吞吐量的瓶颈.
操作系统的设置中要根据机器的配置进行相关的处理, 要给操作系统留下足够调度用的内存
应用或者是数据库的内存配置一定要符合场景要求.

如果内存占用较多一方面会降低CPU的表现,也极容易出现OOM_KILLER的现象.

第三部分 硬盘相关


影响硬盘的性能参数

关键参数: 时延+带宽+IOPS

先说带宽:
磁盘与内存一样也是有带宽的. 不同设备的带宽也时不同的.
之前的磁盘有使用 IDE并行传输的设备. 但是因为并行先之间的干扰太大
速度无法做到很过, 现在都是使用串行传输设备. 一般协议为AHCI
AHCI指代 Advance Host control interface
这个协议非常好的适配了 机械硬盘的特性. 他一般有两种设备接口形式:
比如SATA 或者是 SAS
SATA 可以理解为平民版的串口设备
SAS 指代 serial attach scsi 设备. 属于服务器使用的设备
最新的协议都是 3.0
其中SATA 3.0的协议最高带宽是 6.0Gbps
SAS 3.0协议的最高带宽是12.0Gbps

SATA 也可以用到服务器上面 一遍称之为 near-line 磁盘
但是转速一般只有 7.2krpm SAS的磁盘可以做到15krpm转速.性能要好很多.
但是噪音和功耗都比较大

因为NMVe的快速发展SAS已经不再发布新的版本, 都要迁移到NVMe协议上来

影响硬盘的性能参数

AHCI与NVMe协议的差异. --关于时延和开销
本文只是简单科普, 不进行内部详细协议的分析, 感性来说协议的差异在用
AHCI协议时磁盘的转速有线,寻址和传输都是以毫秒来技术. 所以AHCI的指令都是纳秒级别.
就算是几百上千个指令才到微秒级别与磁盘相比依旧是九牛一毛, 所以AHCI的协议非常体贴的
关照了机械磁盘的一些特性,可以有电梯调度以及一些其他的算法. 时延占比很低
但是随着固态硬盘的发展, 因为固态硬盘没有机械状态.
使用的都是NAND的晶体管存储. 所以电子信号的相应速度也基本上打到了纳秒或者是微秒级别
这个时候AHCI的微秒级别的指令响应时间就会占据传输过程中的较大比率.
因为为了适配NAND存储介质的固态SSD硬盘 就有了 NVMe的存储协议
他的协议可以有很深的队列深度 (磁头一个盘片就一个,深度太深没有用处)
并且降低了指令的数量以及延迟时间,极大的提高了效率.

AHCI天然适配 机械硬盘 NVMe适配固态硬盘.
AHCI一般都SATA或者是SAS接口的设备.
NMVe可以走u.2 后者是PCI-E适配.

需要注意 raid卡也是需要看清楚支持的接口类型, 有可能不支持NVMe的适配.

影响硬盘的性能参数

AHCI 使用SAS后者是SATA硬盘时, 如果选用较高的RAID卡以及高转速的设备.
数据库服务器的性能可能不会低于SATA的SSD的数据库服务器.

原因主要如下:
1. 数据库事务调都是顺序写的redo log来落盘的.DBWR后台进程都是dirty buffer满
或者是时间到了才会批量刷盘. 这样无疑降低了机械盘寻道时间以及延迟较高的缺点
redo log的写入都是顺序写. 机械硬盘可以满速写入.将SAS3.0协议的带宽打满. 与之对应的
SSD在剩余容量较小时因为写放大的原因和SAS协议的上限,并不能够完整的提现SSD的高性能.
2. 虽然SSD的离散读写能力较强. 但是现在内存也很便宜. 高级数据库一般内存量都足够,能够将
尽可能多的数据buffer到内存中去. 因此高并发时, 如果不是cache miss 会出现大量的物理读盘
一般情况下的性能并没有特别大的差异
3. raid卡的缓存介入以及raid算法将IO打散
raid卡能够将磁盘性能尽可能的最大化. 磁盘越大性能越好, 越接近于SAS协议的上限.

所以要是想提高数据库的真正性能, 还是需要选用NVMe的固态硬盘,不然选择SSD还不如高转速的HDD
ssd 现在容量可以做的比高转速的HDD要大很多, 但是断电可能会丢数据,以及数据盘损坏和降速的
概率要高很多.

影响硬盘的性能参数

其实有了时延,也有了带宽
IOPS有时候就可以算出来了.
如果是小块的随机IO读写
IOPS=1s/(寻道时延+传输时延)
如果是大块的顺序IO读写,会将带宽打满
IOPS=(带宽/块大小) (可能略低)

随机IOPS对内存和CPU压力大的数据库系统有非常大的知道意义.
但是如果内存压力不是很大. 很多时候会将压力传导到顺写写上面.
毕竟写入redo log 基本上就已经落盘了, 以为宕机可以通过各种方式
恢复数据.

影响硬盘的性能参数

NVMe以及傲腾相变存储
NVMe 指代 non volatile memory exporess
之前一般使用PCI-E的构型, 现在有了U.2 的 2.5寸样式以及E1.s和E1.l等存储专用的
构型可以选择.
基础一般的存储介质还是NAND的半导体存储. 机制还是使用电容来表示0和1
但是还有一种高级别的存储介质 也就是
傲腾相变内存存储
这个是intel 的技术. 并且需要专用的intelCPU和操作系统驱动才可以支持.
傲腾的存储机理不是电子电容, 而是根据原子排列产生电阻和不产生电阻来实现
的相变存储机制.

傲腾相变内存的接口一般使用 DDR内存条的类型
可以断电不对视数据
他的延迟可以做到微秒一下 比内存稍微高不到一个数量级的 几百纳秒

但是因为占用了 CPU的内存控制器的带宽, 所以会影响服务器的可用内存数量.
并且傲腾的内存也不如SATA或者是NVMe的SSD的容量大.
而且比较昂贵, 不支持国产化.

影响硬盘的性能参数

磁盘容量以及剩余容量对IO性能的影响.
磁盘容量和剩余容量其实对性能是有所影响的, 机械硬盘中不同的存储盘片对性能也有影响.
1. CMR和SMR
CMR是conventional 传统的磁盘, 每个扇区严格独立的.不会有交叉
SMR Shingle 叠瓦硬盘. 每个扇区会有一定程度的overlap, 读写时需要单独处理.
CMR的磁盘单片不会特别大, 同时SMR的磁盘可以做到很大的容量.
但是CMR的性能是比SMR硬盘高很多, 数据库级别的应用使用SMR就是一场灾难,甚至会带来数据
丢失的严重风险.
2. 机械硬盘的剩余容量与单片容量
最开始的硬盘的扇区大小是不一样大的,但是他们相对于中心的角度是恒定的.
当时的扇区不管是0磁道的还是最内圈的速度都是一致的.
但是为了提高磁盘容量, 现在的硬盘的扇区大小一样,也就导致,磁盘的磁头在扫过硬盘时线速度是不
一样的外圈的读写速度会比内圈的读写速度快很多.基本上是扇区所在周长的比率的关系.
磁盘为了性能都是先从完全开始读写. 内圈最后读写. 所以磁盘剩余容量很少时他的性能会明显下降.
SAS硬盘因为高转速, 一般盘片的容量较小, 性能也较好,一般大容量的性能一般都会差一些.
3.固态硬盘的容量.
前面讲过,固态硬盘因为有写放大和GC的存在,如果容量减低,写放大会严重影响写入性能.又因为
固态硬盘使用多控制器同时去读写NAND的芯片, 其实时实现了一定程度上raid0的处理, 所以容量
越大, 一般需要的芯片越多 raid0对应的NAND芯片也遇到, 写入分散程度就会越大,这样固态硬盘的
的写入性能就越好. 所以固态硬盘,建议选择大容量, 并且非常不建议用的非常满.

第四部分 制程与工艺

这一块可能比较虚一些.
芯片的体质一般在封装测试时一般就已经确定了.
型号和主频,睿频信息就基本确定了.

Intel最近好多年一直受制于 14nm工艺,导致AMD使用台积电的7nm 5nm工艺成功实现了逆袭
现在x86芯片的市场占有率, AMD已经超过了2006年速龙时20%的巅峰状态.

但是也要看到AMD基本上是靠性价比来跟Intel进行对抗, 并且Chiplet的构型可以用于
高性能HPC或者是互联网云服务, 微服务化的部署, 但是对数据库等极度复杂的应用场景
Intel的还是具有一定的优势(CPU核间互相访存延迟较低.)

但是也要看到. 随着技术的发展, 没有公司后者人是安全的稍有不慎就会跟玻璃基板的AMD
硬盘一样, 因为客户的信任消失而荡然无存.

CPU都有一个TDP 热设计功耗的参数, 一般情况下CPU在睿频时都会超过TDP的数值,这个时候
工艺的重要性就提现出来了. 好的工艺和制程能够让CPU更好的完成高频的任务.
与之对应的, 现在服务器都有电源管理, 如果不是极度追求PUE, 建议能将电源模式设置为最高
性能, 这样的话能够压榨出最好的服务器性能来.

第五部分 文件系统与虚拟化

Oracle RAC以及Oracle的eXadata一体机有着卓越的性能.
他们有一个杀手锏是 ASM文件存储, 直接由Oracle数据库管理程序管理来管理
磁盘的 raw 裸设备. 能够降低操作系统管理磁盘时的fsync后者是sync系统调用
导致的延迟, 也可以实现操作系统自己的数据库与物理文件的映射.性能更高.

关于文件系统, Windows系统有NTFS文件系统. linux系统有ext3.ext4.xfs等
以及还有一些更加新的文件系统.
但是需要注意, 性能与安全是双刃剑, 性能好往往会导致一定的安全问题, 这一块
需要重点关注.

关于虚拟化: 应用服务器是可以使用虚拟机的. 但是数据库服务器非常不建议使用
虚拟化,以及使用镜像的模式. 可能会导致更多的延迟和不确定性.

计算机科学可以通过多加层次的模式来提高开发效率和便于理解
但是提高性能必须通过缩减层数来实现, 减少命令数能够减少周期,提高性能.

第六部分 网络

前面的内容主要是单机的性能, 但是随着应用的发展,单机已经无法支撑庞大的业务系统.
所以网络层变的尤为重要, 这里简单总结一下影响网络的相关事项:
1. 尽量减少不必要的网络IO
2. 尽量合并网络请求, Http尽量使用强连接而不是短连接.
3. 交互频率和次数较多的环境尽量物理和网络逻辑上部署的近一些,减少网络跳数.
4. 能够内容调用使用IP地址尽量使用IP地址后者内部域名, 不要使用外部域名.
5. 调整网卡的缓存大小, 比如ringbuffer等.
6. 减少内存Copy 使用 epoll或者是DMA提高效率.
7. 要使用充足的网络端口, K8S也有类似的需求.
8. 避免连接队列溢出, 提高队列容量.
9. 减少握手重试此时, 也可以防止一定的TCP_FLOOD攻击.
10.TIME_WAIT进行优化, 避免等待太长,导致端口用尽.

网络相关影响因素

1. 网线以及水晶头的质量, 建议至少六类或者是超六类屏蔽双绞线.
2. 有条件上光纤, 光信号传输应该比电信号传输更可靠和效率高.
3. 交换机尽量专用.业务网络,控制网络,监控网络尽量拆分,避免互相影响.
4. 尽量使用高配置的交换机, 背板性能良好, 故障率,丢包率低的设备
5. 避免线缆的过分弯折,和设备距离较远,保证温度,湿度,以及磁场正常.
6. 注意宿主机的网卡驱动,以及速率以及双工选择,避免异常情况.
7. 是否存在IP地址冲突,mac地址冲突,虚拟mac地址等异常问题.

网络部分参数命令

  • 注意 具体参数值需要根据配置来调整.
ethtool -G eth1 rx 4096 tx 4096
vi /etc/sysctl.conf
net.ipv4.ip_local_port_range = 5000 65000
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tw_recycle = 1
net.core.somaxconn=1024
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 3
net.ipv4.tcp_max_tw_buckets = 32768

总结


服务器性能到底有谁来决定

个人认为服务器的性能是有木桶的短板来决定.
数据库服务器性能的提升一直是不停的提高短板的高度来提高的.

要根据数据库的情况来进行适度的调整.
1. 如果是并发量较少的环境, 一般是内存和IO的压力比较多一些.
2. 如果是并发量很高的环境, 数据库数据量又较大, 并发执行的SQL
时间很长,而且如果远大于CPU的核心数, 那么数据库服务器就会出现
大量的进程上下文切换, 上下文换切换会刷新TLB,导致大量的cache-miss.
会导致性能更加难以为继.
3. 数据库内存的合理分配也很关键. 需要根据业务类型合理分配buffer区域
或者是分配编译后的code cache. 以及留足足够的空间给线程创建以及
数据库自己的管理自己进程进行调度.
4. 不要以数据库100%的压力时来设定最终操作系统支持的数值. x86因为有HT
超线程以及因为有乱序和指令预测执行,性能测试的很多动作CPU是很好进行
预算和判断的,但是实际生产场景很多操作都是没有规律可以预测和判断的.
所以性能测试的结果可能会因为程序的时间和空间的局限性将并发数据计算的
较高. 所以一定要留有一定的空间给操作系统和数据库管理进行维护和使用.
5. 尽可能的优化SQL. 避免hard parse较多,以及不合理的关联和表顺序.尽量
优化索引, 避免全表扫描. 日志表等冷数据较多的场景尽量分表来处理.并发量
较高的表在创建时尽量一次多initial 较高的磁盘区块, 以提前拆表后首次
的访问性能和效率.

分表分区读写分离以及拆分SU分库时性能表现基准问题

分表分区是一个解决性能问题的最快的方法. 
需要说明的是:
如果现实分区分表,最好能够实现在不同的物理机器上面的分区分表
这样才能够最大化的系统性能.
所有的拆分都是有一定的overhead开销的, 如果在同一个物理机器上面,这种开销肯定是
无法抹除的, 只有分摊到不同机器上面实现 1+1=2的极限IO性能才能提高吞吐量.

读写分离也是类似. 必须将读和写的IO分摊到不同的物理机器上面才可以实现最大化的性能.
读写分离和分区分表其实都是在应用层与数据库层之间增加了一个路由层, 增加一层肯定是有
相关的性能损耗的, 必须通过加机器的方式来摊薄新的一层的开销才能够实现容量的提升.

拆分SU与分库的道理也是等同的.
拆分SU会降低单一操作者情况下的响应时间.
他将一个机器内的不同线程之间的调度改成了跨机器跨进程间的网络调度, 性能肯定有损耗.
同一进程内可能只需要线程切换和内存变量在堆区和工作内存的存取的消耗.
跨进程RPC调用的流程可能是
本进程取数->序列号->网络栈->网络硬件设备(时延+带宽)->对方SU进程获取->反序列化->加载内存.进行计算
如果RPC交互增多, 这样的时间损耗是非常致命的.
而且如果调用之间是阻塞的, 会导致响应时间指数级的下降.