17 | 案例篇:如何利用系统缓存优化程序的运行效率?
缓存命中率
- cachestat 提供了整个操作系统缓存的读写命中情况。
- cachetop 提供了每个进程的缓存命中情况。
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)
$ export PATH=$PATH:/usr/share/bcc/tools
$ cachestat 1 3TOTAL MISSES HITS DIRTIES BUFFERS_MB CACHED_MB2 0 2 1 17 2792 0 2 1 17 2792 0 2 1 17 279
- TOTAL ,表示总的 I/O 次数;
- MISSES ,表示缓存未命中的次数;
- HITS ,表示缓存命中的次数;
- DIRTIES, 表示新增到缓存中的脏页数;
- BUFFERS_MB 表示 Buffers 的大小,以 MB 为单位;
- CACHED_MB 表示 Cache 的大小,以 MB 为单位。
$ cachetop
11:58:50 Buffers MB: 258 / Cached MB: 347 / Sort: HITS / Order: ascending
PID UID CMD HITS MISSES DIRTIES READ_HIT% WRITE_HIT%13029 root python 1 0 0 100.0% 0.0%
指定文件的缓存大小
$ export GOPATH=~/go
$ export PATH=~/go/bin:$PATH
$ go get golang.org/x/sys/unix
$ go get github.com/tobert/pcstat/pcstat
$ pcstat /bin/ls
+---------+----------------+------------+-----------+---------+
| Name | Size (bytes) | Pages | Cached | Percent |
|---------+----------------+------------+-----------+---------|
| /bin/ls | 133792 | 33 | 0 | 000.000 |
+---------+----------------+------------+-----------+---------+
$ ls
$ pcstat /bin/ls
+---------+----------------+------------+-----------+---------+
| Name | Size (bytes) | Pages | Cached | Percent |
|---------+----------------+------------+-----------+---------|
| /bin/ls | 133792 | 33 | 33 | 100.000 |
+---------+----------------+------------+-----------+---------+
案例一
# 生成一个 512MB 的临时文件
$ dd if=/dev/sda1 of=file bs=1M count=512
# 清理缓存
$ echo 3 > /proc/sys/vm/drop_caches
$ pcstat file
+-------+----------------+------------+-----------+---------+
| Name | Size (bytes) | Pages | Cached | Percent |
|-------+----------------+------------+-----------+---------|
| file | 536870912 | 131072 | 0 | 000.000 |
+-------+----------------+------------+-----------+---------+
# 每隔 5 秒刷新一次数据
$ cachetop 5
$ dd if=file of=/dev/null bs=1M
512+0 records in
512+0 records out
536870912 bytes (537 MB, 512 MiB) copied, 16.0509 s, 33.4 MB/s
PID UID CMD HITS MISSES DIRTIES READ_HIT% WRITE_HIT%
\.\.\.3264 root dd 37077 37330 0 49.8% 50.2%
$ dd if=file of=/dev/null bs=1M
512+0 records in
512+0 records out
536870912 bytes (537 MB, 512 MiB) copied, 0.118415 s, 4.5 GB/s
10:45:22 Buffers MB: 4 / Cached MB: 719 / Sort: HITS / Order: ascending
PID UID CMD HITS MISSES DIRTIES READ_HIT% WRITE_HIT%
\.\.\.32642 root dd 131637 0 0 100.0% 0.0%
$ pcstat file
+-------+----------------+------------+-----------+---------+
| Name | Size (bytes) | Pages | Cached | Percent |
|-------+----------------+------------+-----------+---------|
| file | 536870912 | 131072 | 131072 | 100.000 |
+-------+----------------+------------+-----------+---------+
案例二
- -d 选项,设置要读取的磁盘或分区路径,默认是查找前缀为 /dev/sd 或者 /dev/xvd 的磁盘。
- -s 选项,设置每次读取的数据量大小,单位为字节,默认为 33554432(也就是 32MB)。
# 每隔 5 秒刷新一次数据
$ cachetop 5
$ docker run --privileged --name=app -itd feisky/app:io-direct
$ docker logs app
Reading data from disk /dev/sdb1 with buffer size 33554432
Time used: 0.929935 s to read 33554432 bytes
Time used: 0.949625 s to read 33554432 bytes
16:39:18 Buffers MB: 73 / Cached MB: 281 / Sort: HITS / Order: ascending
PID UID CMD HITS MISSES DIRTIES READ_HIT% WRITE_HIT%21881 root app 1024 0 0 100.0% 0.0%
# strace -p $(pgrep app)
strace: Process 4988 attached
restart_syscall(<\.\.\. resuming interrupted nanosleep \.\.\.>) = 0
openat(AT_FDCWD, "/dev/sdb1", O_RDONLY|O_DIRECT) = 4
mmap(NULL, 33558528, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f448d240000
read(4, "8vq\213\314\264u\373\4\336K\224\25@\371\1\252\2\262\252q\221\n0\30\225bD\252\266@J"\.\.\., 33554432) = 33554432
write(1, "Time used: 0.948897 s to read 33"\.\.\., 45) = 45
close(4) = 0
int flags = O_RDONLY | O_LARGEFILE | O_DIRECT;
int fd = open(disk, flags, 0755);
# 删除上述案例应用
$ docker rm -f app# 运行修复后的应用
$ docker run --privileged --name=app -itd feisky/app:io-cached
$ docker logs app
Reading data from disk /dev/sdb1 with buffer size 33554432
Time used: 0.037342 s s to read 33554432 bytes
Time used: 0.029676 s to read 33554432 bytes
16:40:08 Buffers MB: 73 / Cached MB: 281 / Sort: HITS / Order: ascending
PID UID CMD HITS MISSES DIRTIES READ_HIT% WRITE_HIT%22106 root app 40960 0 0 100.0% 0.0%
总结
- cachestat 提供了整个系统缓存的读写命中情况。
- cachetop 提供了每个进程的缓存命中情况。
17 | 案例篇:如何利用系统缓存优化程序的运行效率?相关推荐
- 利用系统缓存优化程序的运行效率
Buffer和Cache对系统性能有很大影响,在软件开发的过程中,也可以利用这一点,来优化I/O的性能,提生应用程序的运行效率. 缓存命中率 想利用缓存来提升程序的运行效率,应该怎么评估这个效果尼?换 ...
- linux利用内存加快读盘速度,Linux性能优化从入门到实战:10 内存篇:如何利用Buffer和Cache优化程序的运行效率?...
缓存命中率 缓存命中率,是指直接通过缓存获取数据的请求次数,占所有数据请求次数的百分比,可以衡量缓存使用的好坏.命中率越高,表示使用缓存带来的收益越高,应用程序的性能也就越好. 实际上,缓存是现在所有 ...
- Web Api 内部数据思考 和 利用http缓存优化 Api
在上篇<Web Api 端点设计 与 Oauth>后,接着我们思考Web Api 的内部数据: 其他文章:<API接口安全加强设计方法> 第一 实际使用应该返回怎样的数据 ? ...
- 记一次评论系统缓存优化实践
背景 该项目是当时公司最重点落地战略性的项目之一,离开项目组时DAU达到了6000W以上,主要做富媒体feed流.评论指的是对单条feed的评论,要求评论近实时展示.本文主要分析缓存模型. 公司当时的 ...
- 程序员的数学课16 二分法:如何利用指数爆炸优化程序?
正式讲课之前,我先问你这样一个问题,请你尽可能快速回答. 一张 1 毫米厚度的纸,对折几次后,可以达到地球到月球的距离(39 万公里)? 我在写这篇稿子的时候,问了身边的几个朋友.最小的回答是 1 万 ...
- 19 | 案例篇:为什么系统的Swap变高了(上)
上一节,我通过一个斐波那契数列的案例,带你学习了内存泄漏的分析.如果在程序中直接或间接地分配了动态内存,你一定要记得释放掉它们,否则就会导致内存泄漏,严重时甚至会耗尽系统内存. 不过,反过来讲,当发生 ...
- 混合储能系统容量优化MATLAB程序基于粒子群算法
混合储能系统容量优化MATLAB程序基于粒子群算法 (1)该程序为基于粒子群算法的混合储能系统容量优化程序,中文核心期刊论文源程序,配有该论文,再给一篇类似的参考论文. (2)该程序中混合储能系统为蓄 ...
- 数据库优化案例——————某市中心医院HIS系统
记得在自己学习数据库知识的时候特别喜欢看案例,因为优化的手段是容易掌握的,但是整体的优化思想是很难学会的.这也是为什么自己特别喜欢看案例,今天也开始分享自己做的优化案例. 最近一直很忙,博客产出也少的 ...
- 08 | 案例篇:系统中出现大量不可中断进程和僵尸进程怎么办?(下)
上一节,我给你讲了 Linux 进程状态的含义,以及不可中断进程和僵尸进程产生的原因,我们先来简单复习下. 使用 ps 或者 top 可以查看进程的状态,这些状态包括运行.空闲.不可中断睡眠.可中断睡 ...
最新文章
- 使用可信证书为windows RDP服务提供加密
- 业务基础【概念说明】-userAgent
- 无水印pdf编辑器_偷偷告诉你如何编辑PDF文件,轻松解决这万恶的千古难题
- CSharpGL(39)GLSL光照示例:鼠标拖动太阳(光源)观察平行光的漫反射和镜面反射效果...
- 软考信息系统项目管理师_信息系统安全管理---软考高级之信息系统项目管理师026
- 鸿蒙开发者大会邀请函,将召开史上最大规模开发者大会,华为抓紧调试“鸿蒙”系统...
- Python之turtle画小狗、狮子头和小黄人
- 粒子群优化算法求解函数最值
- element-ui的pagination分页 增加首页和末页
- 火狐浏览器安装插件“组件未验证无法安装”问题解决
- 基于FCOS的航拍巡检图像绝缘子识别
- 在 uniapp 中使用阿里图标
- Unsupervised Deep Homography - Pytorch实现
- 图灵革命如何颠覆我们对世界的认知?
- Python 分析中国城市夜间灯光数据
- 乌隆他尼皇家大学举办建校98周年校庆表彰大会
- OpenCV+OCR文字识别
- 在开发中总结的一点小技巧
- 配上新的pip源再来安装pytorch有如神助
- [清华集训2014]奇数国
热门文章
- mysql 日期_Mysql数据库常见函数(下)——日期时间函数
- php mysql 登录注销_PHP与MYSQL实现用户登录注销
- java stop和int,JAVA并发任务中止的isinterrupted,interupted()
- xamarin.android 控件,Android 库控件 - Xamarin | Microsoft Docs
- 地理必修一三大类岩石_高一地理必修一知识点总结归纳
- 克里斯蒂安贝尔_克里斯蒂安贝尔和乌云背后的幸福线导演合作神秘“大片”
- 不飘了,让图像识别算法快速产业落地
别再实验了,让你的图像识别算法赶紧上线!...
- Python新手常见错误汇总|附代码检查清单
- js下拉 selenium_selenium 难定位元素,时间插件,下拉框定位,string
- tcpdump抓包ftp协议_tcpdump抓包并保存成cap文件