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

内存优化简述

IT那活儿 2023-06-12
378
点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!

优化内存原因概述
因为CPU的速度相对于DISK来说太快了,CPU做运算需要从DISK里拿数据, 这样会造成CPU会经常等待DISK。所以我们需要有一个既能存放数据又速度快的存储器帮助CPU与DISK沟通----内存:
  • 内存的作用
    内存是连接CPU和其他设备(DISK)的通道,起到缓冲和数据交换作用。
  • 内存的特点
    存储数据速度快, 但是数据不是永久存放的, 断电则数据丢失。
1. CPU做运算需要取数据, 会先从内存里查找是否有需要的数据
  • 1)如果内存里能查到则为HIT命中, 那么就直接从内存里取数据(【2】步骤)。
  • 2)如果内存里查不到则为MISS(未命中), 那么就先从硬盘取数据到内存(cache中),再 给CPU(上图【1】【2】步骤)。
2. CPU运算完后,需要将结果再存放回硬盘(需要永久存放)
  • 1)这种运算修改后的数据我们称为dirty data脏数据, 会先给内存(存到buffer中)(上图 中【3】步骤)。
  • 2)内存中的脏数据达到一定的比率(此比率在后面可以通过内核参数优化调整)后会给 硬盘(上图中【4】步骤)。
3. 内存使用LRU算法
当内存满了,新的数据进来,会把最近最少使用的数据丢掉。
4. 内存包括物理内存和虚拟内存(swap)
增加虚拟内存swap的目的是为了增强物理内存的性能, 但是过多的使用swap也不一定好。
物理内存不够用时,会用到虚拟内存swap(注意: 不是绝对的, 不要用free命令看到有使用过swap就认为内存不够了)。
注:
  • 共享内存允许两个或多个进程访问同一块内存区域,这样的进程通讯方式效率高。
  • buffer与cache都为缓存区,CPU从内存里取数据HIT命中就是在cache中找数据,CPU运算后的脏数据从buffer写回到磁盘。
内存管理的单位为页(page),在linux里默认为4K大小。
echo 3 > proc/sys/vm/drop_caches
清除内存里的cache:



内存实时信息查看

vmstat命令可以查看内存相关信息, 这里的swapd,free,buff,cache都与free命令有对应的列。但有两个列是free命令里查看不到的
  • si 实时查看到的从虚拟内存swap到物理内存的值;
  • so实时查看到的从物理内存到虚拟内存swap的值。
所以si,so代表了物理内存与虚拟内存swap之间的交互繁忙程度。交互越繁忙,越能说明内存产生了瓶颈
使用sar -B命令可以得到内存的相关信息:
主要看前面4列:
到底怎么样才说明内存不够?
建议结合free,vmstat,sar命令综合分析,如果满足以下条件,则说明内存出现了瓶颈:
  • free命令看到的available值很小;
  • vmstat命令看到的si,so较多;
  • sar -B命令通过fault/s和majflt/s,算出命中率不高。

总之要多观察,多维度来证实是否真的是内存不够


内存优化思路与方法

1. 如果内存真的出现了瓶颈,那么最好的优化方法仍然是
  • 横向拓展
    看是否将应用的一部分负载转移到其它服务器(LB,分表分库,读写分离等)。
  • 纵向拓展
    换更好的内存,加更大的内存。
  • 微调
    内存能微调的地方主要就是修改内核参数。
2. 内核参数修改
可以修改操作系统的内核参数达到优化操作系统的目的。
3. 查看内核参数
4. 修改内核参数
永久生效。
在/etc/sysctl.conf配置文件里加上要修改的内核参数与值:
net.ipv4.ip_forward = 1
修改保存后,记得要用sysctl -p使之生效。
5. 与内存优化有关的内核参数
  • swappiness表示使用swap分区的使用程度, 可以适当调整;
  • swappiness趋向于0表示尽可能使用物理内存空间;
  • swappiness趋向于100表示积极使用swap。
基本调优规则为
如果物理内存够大,那么就尽量不要使用swap,以提高性能.可以把此参数调小如swappiness=10。
这两个参数合起来理解就是:
内存脏数据到dirty_background_ratio定义的10%时,就会触发数据写到磁盘(但是这个过程是异步的,也就是说还是会有别的应用程序的脏数据能继续写到内存), 如果应用程序往内存里写的比内存往磁盘里写得快,还是有可能达到dirty_ratio定义的30%时,那么就要让写脏数据的应用程序等待,直到它降低到30%以下, 再继续写。
优化思路:
1)dirty_background_ratio
  • 将值调大的优点: 提高写入磁盘效率(因为一次写的数据量大,写的次数少)。
  • 将值调大的缺点: 有可能一次写的数据量过大,造成磁盘IO峰值。
2)dirty_ratio
在应用程序写内存繁忙时,可以把dirty_ratio值调大,可以缓解应用程序的等待。但是调太大可能会造成内存中过量的脏数据。


END


本文作者:贾 杰(上海新炬中北团队)

本文来源:“IT那活儿”公众号

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

评论