你知道5分钟法则和10字节法则么?

如果一条数据每5分钟被访问一次,那么它应该常驻在内存中。类似的,如果想存储只有0和1两个值的标志位,相比于将8个标志位打包为1个字节,将1个标志位单独存储为1个字节是更节约的选择。

本文参考 Jim Gary(图灵奖得主)于1987年发表的论文:The 5 minute rule for trading memory for disc accesses and the 10 byte rule for trading memory for CPU time | ACM SIGMOD Record

5分钟法则

如果数据在磁盘上,需要加载到内存进行读写,这是需要钱和时间的。在某些特殊情况下,由于磁盘读写耗时长因此数据常驻在内存上,但数据常驻在内存上是不经济的行为,因此什么时候数据需要常驻内存是一个值得思考的问题。一个好的建议是:

5分钟法则:每5分钟访问一次的数据应当记录在内存中。

注意5分钟并不是一成不变的,20年前可能是5秒钟法则,20年后有可能是5小时法则,确切的数据依赖于硬件的价格比率,这里使用1986年的价格数据进行论证,标准如下:

  • 磁盘:支持每秒15次的随机访问,价格为15k,因此每秒访问一次该磁盘的代价为1k(1k/a/s,a为access),若支持该磁盘额外计算和通道代价为1k/a/s,则该磁盘访问代价为2k/a/s。
  • 内存:大小为1MB的内存,价格为5k,因此该内存的存储代价为5/KB。

如果记录1KB数据到内存中,能够节省1a/s的磁盘访问,相当于花费的代价从2K变成了5,即便是节省0.1a/s的磁盘访问,也是从200的代价变成了5,这是很划算的。如此可以计算,当数据的访问频率在0.0025a/s(每秒访问0.0025次,即400秒访问1次),是划算到不划算的分界点。

因此,如果一条1KB的数据,访问频率大于400秒1次,就应该存储在内存中,反之应该存储在磁盘中。五分钟法则便是这个意思(用5分钟近似400秒,具体几分钟不重要,主要是描述这个计算方式)。对于更小的数据,盈亏分界点会更大一些,对于更大的数据,盈亏分界点会更小一些。

如果数据的大小超过了单次磁盘传输数据块的大小,例如100KB数据会分成25个4KB大小的数据传输。因此这种情况下100KB的数据按照4KB来计算盈亏分界点,为0.01a/s(100秒访问1次)。

公式推导

一个更正式的推导为:

  • RI:访问数据的预期间隔,单位second/access。
  • M:记录1字节数据到内存的代价,单位dollor/byte。
  • A:每秒一次磁盘访问的成本,单位dollor/access/second。
  • B:数据的大小,单位byte。
  • Bmax:最大磁盘传输块大小,单位byte。

假设B < Bmax,记录数据到内存能节省的代价为:

[\frac{A}{RI} – M \times B ]

当等式为0,即盈亏分界点,RI的值为:

[RI = \frac{A}{M \times B} ]

当 A = 2000,M = 0.005,如下图所示为 RI = f(B) 的函数图像。带入 B = 1000, 可以得出 RI = 400s/a, 即 0.0025a/s。

你知道5分钟法则和10字节法则么?

应用分析

通过一个案例说明5分钟法则的实际应用,客户想将数据库中的所有数据记录到内存中,该数据库有50万条记录,每条记录大约1KB,因此整个数据库约有500MB大小,通过5分钟法则来证明采用内存磁盘混合存储是一个更好的设计。

该应用的事务很简单,几乎所有的事务都只是访问单条记录,需要1秒的响应时间。每个事务占用40ms的CPU和30ms的磁盘。整个应用的最大负荷为600tps(每秒600个事务)。

全内存的设计中,大概需要36个TXP处理器,每个处理器对应16MB的内存。以及两个磁盘存储整个数据库、索引和程序。由于所有数据记录在内存中,大部分时间磁盘是空闲的。

根据5分钟法则,只有访问间隔小于5分钟的数据才应该记录在内存中。并且Hoelshken发现,3%的数据占据了全部访问次数的80%(和二八定律差不多)。统计表明对于600TPS的最大负荷,在50万条记录中,只有30000条记录会在5分钟内被访问2次,并且这6%的数据占全部访问次数的96%。

如果将这6%的数据记录到内存中,每秒的磁盘访问次数会从600降低到24(6004%)次。存储数据的两个磁盘可以轻松撑起24tps的负荷。这样的设计可以节省470MB(500-5004%)的内存和6个处理器。任何应用程序的数据访问都可以使用这个逻辑计算磁盘和内存的最佳大小。

5分钟法则还适用于虚拟内存管理,例如每2分钟访问一个虚拟内存页面(一般4KB),那么该页面就应该记录在内存中,因此一个好的时钟页面置换算法应该有足够的内存在峰值负载下保证每分钟能轮转一次,或者能够检测hot页面(比如一个2分钟的窗口),并对hot页面有特殊的处理。

10字节法则

另一个问题是,什么情况下使用内存资源来节约计算资源(cpu)更划算?或者相反的,牺牲一些计算资源来节省一些内存?这个问题在编写代码时表现为通过展开循环来保存一些数据,或用额外的指令从字节中提取某个比特。

类似于5分钟法则,假设内存成本为5/KB,每秒执行一条指令的成本为0.05,这和10字节的内存成本一致,因此就有了10字节法则:

10字节法则:10字节的内存资源的成本和每秒执行1条指令的计算资源的成本相等。

公式推导

一个更正式的推导为:

  • I:新的设计可以减少的程序的指令的数量。
  • F:指令执行的频率,单位1/second。
  • S:新的设计增加了多少内存,单位byte。

IF指新的设计总共省去的指令数量,如果新的设计增加了执行的指令,那么IF的值为负数。根据10字节法则,总节省成本为:

[I \times F – \frac{S}{10} ]

如果它是一个很大的正数,就说明新的设计节约了很大的成本。

应用分析

例如有如下程序有三个指令,该程序每秒被调用1000次。

1. &#x52A0;&#x8F7D;&#x4E00;&#x4E2A;&#x5B57;&#x8282;&#xFF0C;&#x8BE5;&#x5B57;&#x8282;&#x5B58;&#x50A8;&#x4E86;8&#x4E2A;flag&#xFF0C;&#x5BF9;&#x5E94;8&#x4E2A;&#x6BD4;&#x7279;
2. &#x5229;&#x7528;&#x4F4D;&#x63A9;&#x7801;&#x83B7;&#x53D6;&#x5176;&#x4E2D;&#x4E00;&#x4E2A;flag
3. &#x5224;&#x65AD;&#x8FD9;&#x4E2A;flag&#x7684;&#x503C;
  • 如果一个flag使用一个字节来存储,那么这个程序就不需要指令2,整个程序只需要两个指令,则表示每秒节约了1000次指令的执行。
  • 根据10字节法则,节约1000次指令每秒的计算资源,相当于节省了10000字节的内存资源。
  • 如果一个flag使用一个字节来存储,意味着需要8倍的内存资源,如果总共需要处理100个flag,意味着内存需求从12个字节变成了100个字节,多了88个字节(论文是88,所以不要纠结12*8=96的问题了)。
  • 牺牲了88字节的内存资源,节约了1000次指令每秒的计算资源,也就是10000字节的内存资源,因此净节省为10000-88=9912的内存资源, 投入回报比约为1:100,是非常划算的改变。

带入公式为:I = 1,F = 1000,S = 88,1*1000 – 88/10 = 991.2。

总结

这些规则背后的思想是权衡经济成本评估设计决策的方法,随着硬件性价比的改变,这些规则也会改变。在未来,5分钟法则可能变成5小时法则,10字节法则可能变为100字节法则。

Original: https://www.cnblogs.com/suqinglee/p/16473789.html
Author: 李素晴
Title: 你知道5分钟法则和10字节法则么?

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/612804/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 对炒股看法

    1. 自己的炒股情况 2017 年左右接触炒股, 陆续入迷. 个人情况输的多. 主要输在阅历浅, 策略不连贯, 心态不稳. 期间翻阅了大量书籍, 学到了很多, 开拓了眼界. 真的是…

    数据库 2023年6月9日
    084
  • 设计模式之工厂方法

    一、工厂方法:简单工厂违背了单一职责原则,而且不利于扩展,于是衍生了工厂方法模式,该模式能很好地解决对扩展开放、对修改关闭的需求。 二、实现思路 :对每一个对象都创建一个对应的工厂…

    数据库 2023年6月14日
    0116
  • Virtualbox中ubuntu18配置静态ip地址及DNS

    python开发环境:VirtualBox+Ubuntu18.04 每当我重启电脑重新打开VirtualBox,Ubuntu中的IP地址都会改变,这样,我的开发软件的连接解析地址也…

    数据库 2023年6月6日
    0124
  • 通过Python收集汇聚MySQL 表信息

    一.需求 统计收集各个实例上table的信息,主要是表的记录数及大小。 收集的范围是cmdb中所有的数据库实例。 二.公共基础文件说明 1.配置文件 配置文为db_servers_…

    数据库 2023年6月16日
    0117
  • Python日志模块封装

    一、先上结论 对 Python logging模块进行二次封装 -*- coding:utf-8 -*- 作者:IT小学生蔡坨坨 博客:caituotuo.top 时间:2022/…

    数据库 2023年6月11日
    093
  • 数据库操作命令

    MySQL Key Command 清屏 (滚屏 ) 登录 切换数据库 查看数据库 查看表 查看表结构 退出 帮助 Key Command 查看可用字符集 查看默认字符集 设置默认…

    数据库 2023年5月24日
    076
  • 2_jQuery

    jQuery, 顾名思义, 也就是JavaScript和查询(Query), 它就是辅助JavaScript开发的js类库 它的核心思想write less, do more(写的…

    数据库 2023年6月11日
    097
  • jdbc-实现用户登录业务(解决sql注入问题)

    package com.cqust; import java.sql.*;import java.util.HashMap;import java.util.Map;import …

    数据库 2023年5月24日
    069
  • springboot~HandlerFunction和RouterFunction

    HandlerFunction和RouterFunction RouterFunction为我们应用程序添加一个新的路由,这个路由需要绑定一个HandlerFunction,做为它…

    数据库 2023年6月6日
    075
  • MySQL中的触发器

    1.定义: 触发器和存储过程相似,都是嵌入到 MySQL 中的一段程序。触发器是由事件来触发某个操作。当数据库执行这些事件时,就会激活触发器来执行相应的操作。这些事件称为触发条件,…

    数据库 2023年6月16日
    0115
  • Executor 创建线程

    Executors创建有四种创建方式: newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIF…

    数据库 2023年6月9日
    0101
  • Ceph 块存储 创建的image 映射成块设备

    将创建的volume1映射成块设备 [root@mysql-server ceph]# rbd map rbd_pool/volume1 rbd: sysfs write fail…

    数据库 2023年6月14日
    0146
  • Python第二十天 shutil 模块 zipfile tarfile 模块

    Python第二十天 shutil 模块 zipfile tarfile 模块 注意:压缩打包/解压解包目录和文件使用tarfile模块而不要使用shutil 模块!!! os文件…

    数据库 2023年6月9日
    071
  • SFML学习之配置环境(VS2019)

    vs2019 SFML环境配置 主要就是两个地址和一个链接的设置 一切的源头都在官网:SFML官网:https://www.sfml-dev.org/download.php 下载…

    数据库 2023年6月11日
    074
  • Centos7 离线安装K3s

    1、安装前准备 github地址:https://github.com/k3s-io/k3s/releases k3s二进制文件:k3s下载地址:github地址 / 百度网盘地址…

    数据库 2023年6月14日
    0107
  • mysql8使用tmpfs内存磁盘当内存数据库的配置方法

    内存关系数据库没有找到开源好用的,很多都是商用。虽然mysql有memory引擎,但写是整体锁表,没法用。 一直想将mysql放入内存中,搜索n次资料,没找到合适的,可能之前思路不…

    数据库 2023年6月14日
    088
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球