DB性能跟不上,加缓存就够了?

news2024/11/24 15:51:15

服务端软件开发时,通常会把数据存储在DB。而服务端系统遇到的第一个性能瓶颈,往往发生在访问DB时。
这时大部分开发会拿出“缓存”,通过使用Redis在DB前提供一层缓存数据,缓解DB压力,提升服务端性能。

在数据库前添加数据缓存,常见的性能优化方式

这种添加缓存的策略一定有效吗?这种策略在什么情况下是有效的呢?理论分析,添加缓存最佳策略么?
如果我们对访问性能要求高,希望数据在1ms,乃至100微妙内完成处理,我们还能用这个添加缓存的策略么?

1 理解局部性原理


Intel 8265U的CPU L1 Cache只有256K,L2 Cache有个1MB,L3 Cache有12MB。共13MB存储空间,如按7美元/1MB的价格计算,就要91美元。
内存8GB,容量是CPU Cache 600多倍,120美元。如按今天价格,恐怕不到40美元。128G的SSD和1T的HDD,现在的价格加起来也不会超过100美元。虽容量是内存16倍乃至128倍,但访问速度不到内存1/1000。

性能和价格的巨大差异,给我们工程师带来挑战:能不能既享受CPU Cache速度,又享受内存、硬盘巨大的容量和低廉的价格呢?
想要同时享受到这三点,答案就是存储器中数据的局部性原理(Principle of Locality)。可利用这个原理制定管理和访问数据的策略。这个局部性原理包括时间局部性(temporal locality)和空间局部性(spatial locality)这两种策略。

2 时间局部性

如果一个数据被访问了,那它在短时间内还会被再次访问。

如小说,今天读了一会儿,没读完,明天还会继续读。同理电子商务系统,一个用户打开App,看到首屏。推断他应该很快还会再次访问网站的其他内容或页面,就将这个用户的个人信息,从存储在硬盘的数据库读取到内存的缓存中来。这利用的就是时间局部性。

同一份数据在短时间内会反复多次被访问:

3 空间局部性

如果一个数据被访问了,那么和它相邻的数据也很快会被访问。

读完了这本书之后,感觉这书不错,所以就会借阅整套。程序访问了数组首项后,多半会循环访问下一项。因为,在存储数据的时候,数组内的多项数据会存储在相邻的位置。这就好比图书馆会把“哈利波特”系列放在一个书架上,摆放在一起,加载时,也会一并加载。我们去图书馆借书,往往会一次性把7本都借回来。

4 相邻的数据会被连续访问

有了时间局部性和空间局部性,不用再把所有数据都放在内存,也不用都放在HDD,而是把访问次数多的数据,放在贵但快的存储器,把访问次数少的数据,放在慢但大点的存储器。
这样组合使用内存、SSD硬盘以及HDD硬盘,最低成本提供实际所需的数据存储、管理和访问需求。

5 花最少的钱,装下亚马逊的所有商品?

通过局部性原理,利用不同层次存储器的组合,究竟会有什么样的好处。

提供一个亚马逊电商网站。假设里面有6亿件商品,如果每件商品需要4MB的存储空间,需2400TB( = 6亿 × 4MB)数据存储。

如把数据都放在内存,就需3600万美元( = 2400TB/1MB × 0.015美元 = 3600万美元)。但这6亿件商品,不是每件商品都会被经常访问。如有Kindle,也一定有无人问津商品,如缅甸语词典。

如只在内存里放前1%热门商品,即600万件热门商品,而把剩下商品,放在机械式HDD硬盘,则需存储成本下降到45.6万美元( = 3600 万美元 × 1% + 2400TB / 1MB × 0.00004 美元),是原来成本的1.3%左右。
这就是时间局部性。把有用户访问过数据,加载到内存,一旦内存放不下,就把最长时间没在内存被访问过的数据,从内存移走,这就是LRU(Least Recently Used)。
热门商品被访问得多,就会始终被保留在内存,冷门商品被访问得少,就只存放在HDD,数据读取也都是直接访问硬盘。即使加载到内存中,也会很快被移除。越热门,越容易在内存中找到,也就更好地利用了内存的随机访问性能。

只放600万件商品真的可以满足我们实际的线上服务请求吗?
要看LRU缓存命中率(Hit Rate/Hit Ratio),即访问的数据中,可在我们设置的内存缓存中找到的占比。

内存随机访问请求需要100ns。极限情况下,内存可以支持1000万次随机访问。我们用了24TB内存,如果8G一条的话,意味着有3000条内存,可以支持每秒300亿次( = 24TB/8GB × 1s/100ns)访问。以亚马逊2017年3亿的用户数来看,我们估算每天的活跃用户为1亿,这1亿用户每人平均会访问100个商品,那么平均每秒访问的商品数量,就是12万次。

但如数据没有命中内存,那么对应的数据请求就要访问到HDD磁盘了。一块HDD硬盘只能支撑每秒100次的随机访问,2400TB的数据,以4TB一块磁盘来计算,有600块磁盘,也就是能支撑每秒 6万次( = 2400TB/4TB × 1s/10ms )的随机访问。

这意味所有商品访问请求,都直接到了HDD磁盘,HDD磁盘支撑不了这样的压力。我们至少要50%的缓存命中率,HDD磁盘才能支撑对应的访问次数。不然的话,我们要么选择添加更多数量的HDD硬盘,做到每秒12万次的随机访问,或者将HDD替换成SSD硬盘,让单个硬盘可以支持更多的随机访问请求。

这只是一个简单估算。实际应用程序中,查看一个商品数据意味着不止一次随机内存或随机磁盘访问。对应数据存储空间也不止要考虑数据,还需要考虑维护数据结构的空间,而缓存的命中率和访问请求也要考虑均值和峰值的问题。

估算过程要理解如何进行存储器的硬件规划。要考虑硬件的成本、访问的数据量以及访问的数据分布,然后根据这些数据的估算,来组合不同的存储器,能用尽可能低的成本支撑所需要的服务器压力。而当你用上了数据访问的局部性原理,组合起了多种存储器,你也就理解了怎么基于存储器层次结构,来进行硬件规划了。

6 总结

实际的计算机日常的开发和应用中,对于数据的访问总是会存在一定的局部性。有时候,这个局部性是时间局部性,就是我们最近访问过的数据还会被反复访问。有时候,这个局部性是空间局部性,就是我们最近访问过数据附近的数据很快会被访问到。

而局部性的存在,使得我们可以在应用开发中使用缓存这个有利的武器。比如,通过将热点数据加载并保留在速度更快的存储设备里面,我们可以用更低的成本来支撑服务器。

通过亚马逊这个例子,我们可以看到,我们可以通过快速估算的方式,来判断这个添加缓存的策略是否能够满足我们的需求,以及在估算的服务器负载的情况下,需要规划多少硬件设备。这个“估算+规划”的能力,是每一个期望成长为架构师的工程师,必须掌握的能力。

遇到性能问题,特别是访问存储器的性能问题的时候,是否可以简单地添加一层数据缓存就能让问题迎刃而解呢?
亚马逊网站商品数据的例子,似乎给了我们一个“Yes”。那这个答案是否放之四海皆准呢?下回分解

参考

  • 《计算机组成与设计:硬件/软件接口》的5.1~5.2小节

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/154539.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nohup后台运行,进程查看与终止(ubuntu)

1.nohup用途:不挂断地运行命令。语法:nohup Command [ Arg … ] [ & ]无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohu…

threejs 学习一

前提 threejs官网:https://threejs.org/ 由于官网访问慢,可以github下载压缩包解压后本地启动 github地址:https://github.com/mrdoob/three.js/ 下载好后解压 安装依赖 npm install 启动:npm start 目录介绍: …

语音识别技术简叙述

语音识别技术简述 语音识别的概念 语音识别技术都是让智能设备能够听懂人类语言,其实一门涉及数学信号处理、人工智能、语言学、数理统计学、声学、情感学及心理学等多学科交叉的学科。这项技术可以提供比如自动客服、自动语音翻译、命令控制,语音验证…

【vue】关于vue2和vue3响应式原理的区别

我们都知道,在Vue2中的数据响应式原理存在许多缺陷。 例如无法对新增和直接删除的数据做到响应式,无法直接操作数组进行响应式处理等等。 而在Vue3中,作者很好的解决了这些缺陷,让我们来对比一下Vue2与Vue3对数据响应式处理的具体…

前端如何保证设置的font-family成功生效?

背景 最近开发的一个新页面,在产品验收的时候跟我反馈说页面里的字体跟设计稿中的字体不一样; 问题的关键是我明明记得我有单独设置过 font-family属性,于是我通过Chorme浏览器的调试工具查看了一下DOM的生效样式; 明明是已经设…

IDEA、TortoiseSVN,TortoiseGit提交忽略文件或文件夹

使用IDEA 的SVN插件提交文件是总是会提交一些不需要提交的文件; 我们可以通过一些简单设置忽略这些文件&#xff1a; 1、IDEA 1、idea设置<<--File Types<<--ignore files and folders 原有的过滤条件&#xff1a;*.hprof;*.pyc;*.pyo;*.rbc;*.yarb;*~;.DS_Store…

yolov3-tiny的darknet权重转onnx

前言 之前一直鸽了yolov3-tiny的onnx模型修复&#xff0c;今天终于把最后一个bug解决了&#xff0c;如果想直接享受成果的&#xff0c;直接点我的github仓库下载&#xff0c;使用说明都写了&#xff0c;这篇文章呢主要是给大家分享一下思路和过程&#xff0c;希望能够启发更多…

初识Linux

文章目录初识Linux操作系统概述硬件和软件操作系统常见操作系统总结初识LinuxLinux的诞生Linux内核Linux发行版总结虚拟机介绍虚拟机总结远程连接Linux系统图形化、命令行使用命令行学习Linux系统远程连接工具总结初识Linux 操作系统概述 硬件和软件 我们所熟知的计算机是由…

领域驱动设计:微服务设计为什么要选择DDD?

我们知道&#xff0c;微服务设计过程中往往会面临边界如何划定的问题&#xff0c;我经常看到项目团队为微服务到底应该拆多小而争得面红耳赤。不同的人会根据自己对微服务的理解而拆分出不同的微服务&#xff0c;于是大家各执一词&#xff0c;谁也说服不了谁&#xff0c;都觉得…

Day855.生产者-消费者模式 -Java 并发编程实战

生产者-消费者模式 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于生产者-消费者模式的内容。 Worker Thread 模式类比的是工厂里车间工人的工作模式。 但其实在现实世界&#xff0c;工厂里还有一种流水线的工作模式&#xff0c;类比到编程领域&#xff0c;就是生…

RoboMaster EP 实用功能开发(三): 基于树莓派的ROS2机器人系统搭建

功能&#xff1a;在树莓派4b上安装ros2系统&#xff0c;引入robomaster sdk&#xff0c;搭建一个基于ROS2的机器人系统&#xff0c;用于ROS系统的学习、开发和实践。 硬件&#xff1a;RobotMaster EP、树莓派4b 系统平台&#xff1a;Ubuntu 20.04、ROS2&#xff08;Foxy&…

Selenium【Selenium环境搭建与Junit5】

Selenium【Selenium环境搭建与Junit5】&#x1f34e;一. 自行下载谷歌浏览器或者火狐浏览器&#x1f352;1.1 安装好之后需要去掉谷歌(火狐)浏览器自动更新(建议)&#x1f352;1.2下载谷歌(火狐)驱动&#x1f34e;二.Selenium下载与配置&#x1f352;2.1Selenium下载&#x1f3…

服务案例|SQL Server数据库监控反复重启问题

监控平台对主流数据库的监控&#xff0c;能够及时发现异常&#xff0c;快速响应&#xff0c;保障业务系统的稳定。平台通过对SQL Server数据库监控&#xff0c;帮助用户在数据库出现异常时事件处理。 SQL Server数据库监控内容如下 1 、数据库服务器基本性能监控。包括&#…

Hive/MaxCompute SQL性能优化(三):数据倾斜优化实战

SQL性能优化系列&#xff1a;Hive/MaxCompute SQL性能优化(一)&#xff1a;什么是数据倾斜Hive/MaxCompute SQL性能优化(二)&#xff1a;如何定位数据倾斜前面介绍了如何定位数据倾斜&#xff0c;本文介绍如果遇到各种数据倾斜的情况该怎样优化代码。Map长尾优化一、Map读取数据…

ArcGIS如何将Excel表格转换为SHP格式

概述数据的获取渠道是多种多样的&#xff0c;获取的数据格式也是多种多样&#xff0c;作为一名GISer&#xff0c;需要熟练掌握各种格式的数据之间的转换&#xff0c;例如本文要介绍的Excel格式的数据&#xff0c;经常会遇到&#xff0c;这里为大家介绍一下转换方法&#xff0c;…

区块链基础知识(二)

密码学与安全技术 参考书籍 《区块链原理、设计与应用》 Hash算法 加解密算法 混合加密机制 离散对数与Diffie-Hellman秘钥交换协议 消息认证码 数字签名 PKI体系 PKI基本组件 证书签发 证书的撤销 Merkle tree结构 默克尔树逐层记录哈希值的特点&#xff0c;让它具有了一些独特…

【我的渲染技术进阶之旅】关于C++轻量级界面开发框架Dear ImGui介绍

文章目录一、怎么知道ImGui的1.1 Filament中有使用ImGui1.2 其他很多渲染框架都有使用ImGui二、ImGui介绍2.1 ImGui风格2.2 Imgui介绍2.2.1 Imgui简介2.2.2 Imgui用法2.2.3 Demo示例2.2.4 集成2.2.5 更多案例2.3 查看Imgui实例源代码2.3.1 运行demo2.3.2 项目结构分析2.3.3 示例…

TCP/IP网络编程(2)——套接字类型与协议设置

文章目录二、套接字类型与协议设置2.1 套接字协议及数据传输特性2.1.1 创建套接字2.1.2 协议族&#xff08;Protocol Family&#xff09;2.1.3 套接字类型&#xff08;Type&#xff09;2.1.4 套接字类型1&#xff1a;面向连接的套接字&#xff08;SOCK_STREAM&#xff09;2.1.5…

RHCE学习笔记-133-2

rpm and kickstart The RPM Way 不会有互动事件 可以适用在所有软件,如kernerl和其他额外的软件都可以以rpm的形式 不需要安装前面的版本才能安装后面的版本 RPM Packge manager RPM components local database /var/lib/rpm rpm and related executables package files primar…

大数据NiFi(十三):NiFi监控

文章目录 NiFi监控 一、处理器状态指示有如下几种情况 二、对于每个组的监控情况如下