暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

内存大小与性能的理解

济南小老虎 2024-06-06
93

背景

上周末同事负责的一个项目出现了卡顿.
应用层专家给出的结论是:
因为开启了profiler, 导致性能下降. 引起卡顿.
数据库dba给出的结论是:
因为内存不足, 导致无法将data buffer填充到内存区域
引起大量的物理读的操作, 进而引起卡顿.
云服务商给的结论是:
数据库服务器的数据磁盘使用的是分布式存储
不适合SQLServer这类数据库的应用, 需要升级.

紧接着本周又出现了一个Oracle的异常问题
查看AWR发现, 有一个大表一小时产生了3.4TBytes的物理读.
然后awr的最后的 建议里面提高,增加SGA区域可以降低物理读.
突然想到, 其实两者的问题原因是类似的.

内存作为一个缓冲.具有非常大的提速增效的功能.


关于算力和内存的关系

算力是最近一个非常火的话题
因为英伟达的AI算力卡占据了非常多的公众号的内容.
算力是下一代科技革命的基础设施已经深入人心.

其实不仅仅GPU有算力的说法, CPU也是有算力的说法.
CPU的能力能够决定很大一部分计算的速度.

但是需要说明的是 除了一小部分科学计算.
大部分计算都需要有大量的内存和磁盘的交互
获取数据, 加工数据, 存储数据.

不管是SMP架构的服务器还是NUMA架构的服务器.
CPU都需要跟内存交互获取需要计算的数据.

所以CPU可以决定上限, 但是内存和磁盘会决定计算能力的下线.

涉及到算力的内存和存储的参数主要有三个:
带宽 时延 频率
三者缺一不可.


关于内存对算力的影响

内存的频率决定,内存能否跟的上CPU的算力. 
如果内存频率很低, CPU可能处于空跑状态.
CPU可能利率用很高, 但是实际上不出力. 现象可能为:
CPU很高, 但是风扇转速和功耗都不高.
因为内存喂不饱CPU,导致CPU等待空跑而不是努力干活.

内存的带宽决定单位时间内内存能够给出的数据量.
现阶段都是多核心的CPU. 工作频率可能决定给单个CPU干活的效率
内存带宽才可能决定给所有CPU干活的上限.
一个简单的计算. 64核心的服务器. 3Ghz的工作频率, 64为的处理器的情况下
64*4*8 GB/S 可能是一个很简单的总体的能够数据的带宽.
如果加上SIMD 类似于AVX512 NENO等指令集, 他能够需要的带宽会更高.
这也是为什么英伟达采用自己的 GPU链接方式,而不是采用DDR或者是PCI-E
自有协议的带宽更高.

延迟决定一个事务响应的时间.
延迟越低 CPU越能够在更快的时间内完成对数据的读取和写入.
对数据的操作由CPU的能力和业务算法来决定, 但是读取和写入纯粹靠内存的性能.
延迟的核心其实是CL 值 .
需要说明 内存不一定是越大越好, 需要更高的工作频率和更低的CL值.
减少内存读写的延迟, 减少磁盘读写的延迟, 减少网络交互的延迟能够最大程度的提高性能.


对最近宕机问题的理解

1. 数据库需要大量的内存作为buffer.
数据库需要有一个大内存进行存放data buffer
需要有一个大内存进行 sort buffer 需要有一个大内存用于存储 parse 后的执行计划.
如果内存比较小, 可以运行 但是遇到大表的读写. 大并发下PGA的使用.
大量SQL执行下的执行计划的存储和编译需求时
内存不够, 会极大降低系统的响应效率.
影响客户体验.

2.关于应用服务器
Java应用需要大量内存做堆区. 堆区不够用救护易产生大量的GC 引起卡顿和CPU利用率上升.
优秀的功能开发可能会使用较少的内存能够实现大量的工作
但是比较差的开发,可能会浪费很多内存, 浪费很多资源进行计算, 会导致内存使用剧增
比如一些内存排序, 一些大表的无关列的查询与使用.

除了堆区之后还需要有很多内存用于元数据区, 方法区, GC也会使用. 线程堆栈也会使用.
如果内存不足了,不仅会oom 还会 out of stack.
高并发时 java new 内存的需求暴增, 会导致大量的内存使用
如果内存不足, 可能会导致机器卡顿 然后到宕机

3. 关于操作系统.
操作系统会缓存大量的最近读写的文件.
如果是web服务器, 会缓存最近读取的文件
如果是应用服务器, 加载的jar包也会记录到内存cache中去
如果写入日志,也会将日志占用缓存
如果还有文件上传下载的需求也会占用大量内存.

如果此时有一个突发的内存需求. linux 会先将内存中的区域排空 drain
然后才能够进行使用.
此时内存的清空, 初始化, 以及写入可能会导致很大的卡顿.
这个时候他的效率基本上就是 受到内存工作频率的影响.
因为此时一般是单线程进行回收和申请
可以理解为 是两倍的内存用量 处于 内存的工作频率
比如一个 3.2GB内存的申请, 需要至少排干3.2GB内存,然后再往里面写入数据
内存如果是 3200MT/S的话. 等效工作频率下至少需要 两秒钟才可以完成这个工作.
如果加上CPU的计算, 磁盘的缓慢处理. 还有业务代码的一些延迟
可能超过3秒也不是不可能.
所以有时候一些动作的性能跟内存的申请是有很大的关系的


总结

CPU 就像是一个学生.
老师则是一个欲求无穷的人.
他做题的速度决定他的排名.
速度越快, 他能够做的题目越多

此时内存就像是他读和写字的速度.
大脑快, 读的快写的快才可以更快的做题.

CPU内的缓存和取指执行等.则是决定他的思路的快慢.
IPC决定他的真实速度,而不是虚张声势的速度


文章转载自济南小老虎,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论