LINUX性能优化--利用缓存提升性能

在内存基础篇讲了一个概念就是存储层次的概念,内存肯定是硬盘的存储速度快。
然后上文也得出了一个结论:
Buffer 和 Cache 分别缓存的是对磁盘和文件系统的读写数据。
1 从写的角度来说,不仅可以优化磁盘和文件的写入,对应用程序也有好处,应用程序可以在数据真正落盘前,就返回去做其他工作。
2 从读的角度来说,不仅可以提高那些频繁访问数据的读取速度,也降低了频繁 I/O 对磁盘的压力
那么是否可以利用Buffer和Cache来提升系统的性能呢?
答案是肯定的。
性能优化的,必须要有个量化的标准来评估的效果,那么用什么标准来评估结果呢?
缓存命中率
所谓缓存命中率,是指直接通过缓存获取数据的请求次数,占所有数据请求次数的百分比。
自然而然:
命中率越高,表示使用缓存带来的收益越高,应用程序的性能也就越好。
在所有的高性能的系统中,肯定离不开缓存的影子。主要就是根据二八原则,把热点数据放到内存里面,减少访问磁盘IO的次数。
所以必须要有查询访问缓存的次数的工具。
在LINUX上面有两个工具提供了这个功能,分别是
cachestat 提供了整个操作系统缓存的读写命中情况。
cachetop 提供了每个进程的缓存命中情况
这两个工具都是 bcc 软件包的一部分,它们基于 Linux 内核的 eBPF(extended Berkeley Packet Filters)机制,来跟踪内核中管理的缓存,并输出缓存的使用和命中情况。
安装:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4052245BD4284CDD
echo “deb https://repo.iovisor.org/apt/xenial xenial main” | sudo tee /etc/apt/sources.list.d/iovisor.list
sudo apt-get update
sudo apt-get install -y bcc-tools libbcc-examples linux-headers-$(uname -r)
bcc 提供的所有工具就都安装到 /usr/share/bcc/tools 这个目录中了
需要修改环境变量:
$ export PATH=$PATH:/usr/share/bcc/tools
在这里插入图片描述
HITS ,表示缓存命中的次数;
MISSES ,表示缓存未命中的次数;
DIRTIES, 表示新增到缓存中的脏页数;
HITRATIO, 缓存的命中率;
BUFFERS_MB 表示 Buffers 的大小,以 MB 为单位;
CACHED_MB 表示 Cache 的大小,以 MB 为单位。
在来看看cachetop的输出
在这里插入图片描述
默认按照缓存的命中次数(HITS)排序,展示了每个进程的缓存命中情况。
具体到每一个指标,这里的 HITS、MISSES 和 DIRTIES ,跟 cachestat 里的含义一样,分别代表间隔时间内的缓存命中次数、未命中次数以及新增到缓存中的脏页数。
而 READ_HIT 和 WRITE_HIT ,分别表示读和写的缓存命中率。
指定文件在内存中的缓存大小
使用工具pcstat
安装pcstat:
1 安装go
2 go get golang.org/x/sys/unix
3 go get github.com/tobert/pcstat/pcstat
比如展示以下 ls的使用情况
在这里插入图片描述
pcstat /bin/ls
Cached 就是 /bin/ls 在缓存中的大小,而 Percent 则是缓存的百分比
使用dd测试
dd 作为一个磁盘和文件的拷贝工具,经常被拿来测试磁盘或者文件系统的读写性能。
环境:
1 ubuntu 18.04
2 2核心4G
步骤:
1 生成一个512MB的临时文件
dd if=/dev/sda1 of=file bs=1M count=512
2 清理缓存
echo 3 > /proc/sys/vm/drop_caches
3 运行 pcstat 命令,确认刚刚生成的文件不在缓存中
在这里插入图片描述
4 开启一个终端,运行
cachetop 5
5 dd if=file of=/dev/null bs=1M
在这里插入图片描述
结果是1.3GB/S
在看看 cachetop
在这里插入图片描述
可以看到命中率只有50%
6 再次运行:
dd if=file of=/dev/null bs=1M
在这里插入图片描述
哇,这次到了5.4GB/S,整整提高了4倍
在看看cachetop
在这里插入图片描述
这次的读的缓存命中率是 100.0%,也就是说这次的 dd 命令全部命中了缓存,所以才会看到那么高的性能。
再次看看pcstat file
在这里插入图片描述
可以看到的是,所有的file内容已经被缓存起来了
直接IO
在这里插入图片描述
内存以页为单位进行管理,而每个页的大小是 4KB。所以,在 5 秒的时间间隔里,命中的缓存为 40960 * 4K/1024 = 80MB,再除以 5 秒,可以得到每秒读的缓存是 16MB,显然跟案例应用的 32 MB/s 相差一倍。
那么,要判断应用程序是否用了直接 I/O,最简单的方法当然是观察它的系统调用,查找应用程序在调用它们时的选项。使用什么工具来观察系统调用呢?自然还是 strace。
在这里插入图片描述
不知道用了直接IO,cachetop 算到的还是32MB,用到了缓存到底是什么问题。。。。。
后面研究研究。。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章