Linux性能优化实战
倪朋飞
微软资深工程师,Kubernetes项目维护者
立即订阅
23395 人已学习
课程目录
已完结 64 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (2讲)
开篇词 | 别再让Linux性能问题成为你的绊脚石
免费
01 | 如何学习Linux性能优化?
CPU 性能篇 (13讲)
02 | 基础篇:到底应该怎么理解“平均负载”?
03 | 基础篇:经常说的 CPU 上下文切换是什么意思?(上)
04 | 基础篇:经常说的 CPU 上下文切换是什么意思?(下)
05 | 基础篇:某个应用的CPU使用率居然达到100%,我该怎么办?
06 | 案例篇:系统的 CPU 使用率很高,但为啥却找不到高 CPU 的应用?
07 | 案例篇:系统中出现大量不可中断进程和僵尸进程怎么办?(上)
08 | 案例篇:系统中出现大量不可中断进程和僵尸进程怎么办?(下)
09 | 基础篇:怎么理解Linux软中断?
10 | 案例篇:系统的软中断CPU使用率升高,我该怎么办?
11 | 套路篇:如何迅速分析出系统CPU的瓶颈在哪里?
12 | 套路篇:CPU 性能优化的几个思路
13 | 答疑(一):无法模拟出 RES 中断的问题,怎么办?
14 | 答疑(二):如何用perf工具分析Java程序?
内存性能篇 (8讲)
15 | 基础篇:Linux内存是怎么工作的?
16 | 基础篇:怎么理解内存中的Buffer和Cache?
17 | 案例篇:如何利用系统缓存优化程序的运行效率?
18 | 案例篇:内存泄漏了,我该如何定位和处理?
19 | 案例篇:为什么系统的Swap变高了(上)
20 | 案例篇:为什么系统的Swap变高了?(下)
21 | 套路篇:如何“快准狠”找到系统内存的问题?
22 | 答疑(三):文件系统与磁盘的区别是什么?
I/O 性能篇 (10讲)
23 | 基础篇:Linux 文件系统是怎么工作的?
24 | 基础篇:Linux 磁盘I/O是怎么工作的(上)
25 | 基础篇:Linux 磁盘I/O是怎么工作的(下)
26 | 案例篇:如何找出狂打日志的“内鬼”?
27 | 案例篇:为什么我的磁盘I/O延迟很高?
28 | 案例篇:一个SQL查询要15秒,这是怎么回事?
29 | 案例篇:Redis响应严重延迟,如何解决?
30 | 套路篇:如何迅速分析出系统I/O的瓶颈在哪里?
31 | 套路篇:磁盘 I/O 性能优化的几个思路
32 | 答疑(四):阻塞、非阻塞 I/O 与同步、异步 I/O 的区别和联系
网络性能篇 (13讲)
33 | 关于 Linux 网络,你必须知道这些(上)
34 | 关于 Linux 网络,你必须知道这些(下)
35 | 基础篇:C10K 和 C1000K 回顾
36 | 套路篇:怎么评估系统的网络性能?
37 | 案例篇:DNS 解析时快时慢,我该怎么办?
38 | 案例篇:怎么使用 tcpdump 和 Wireshark 分析网络流量?
39 | 案例篇:怎么缓解 DDoS 攻击带来的性能下降问题?
40 | 案例篇:网络请求延迟变大了,我该怎么办?
41 | 案例篇:如何优化 NAT 性能?(上)
42 | 案例篇:如何优化 NAT 性能?(下)
43 | 套路篇:网络性能优化的几个思路(上)
44 | 套路篇:网络性能优化的几个思路(下)
45 | 答疑(五):网络收发过程中,缓冲区位置在哪里?
综合实战篇 (13讲)
46 | 案例篇:为什么应用容器化后,启动慢了很多?
47 | 案例篇:服务器总是时不时丢包,我该怎么办?(上)
48 | 案例篇:服务器总是时不时丢包,我该怎么办?(下)
49 | 案例篇:内核线程 CPU 利用率太高,我该怎么办?
50 | 案例篇:动态追踪怎么用?(上)
51 | 案例篇:动态追踪怎么用?(下)
52 | 案例篇:服务吞吐量下降很厉害,怎么分析?
53 | 套路篇:系统监控的综合思路
54 | 套路篇:应用监控的一般思路
55 | 套路篇:分析性能问题的一般步骤
56 | 套路篇:优化性能问题的一般方法
57 | 套路篇:Linux 性能工具速查
58 | 答疑(六):容器冷启动如何性能分析?
加餐篇 (4讲)
加餐(一) | 书单推荐:性能优化和Linux 系统原理
加餐(二) | 书单推荐:网络原理和 Linux 内核实现
用户故事 | “半路出家 ”,也要顺利拿下性能优化!
用户故事 | 运维和开发工程师们怎么说?
结束语 (1讲)
结束语 | 愿你攻克性能难关
Linux性能优化实战
登录|注册

22 | 答疑(三):文件系统与磁盘的区别是什么?

倪朋飞 2019-01-09
你好,我是倪朋飞。
专栏更新至今,四大基础模块的第二个模块——内存性能篇,我们就已经学完了。很开心你还没有掉队,仍然在积极学习和实践操作,并且热情地留言与讨论。
这些留言中,我非常高兴看到,很多同学用学过的案例思路,解决了实际工作中的性能问题。我也非常感谢 espzest、大甜菜、Smile 等积极思考的同学,指出了文章中某些不当或者不严谨的地方。另外,还有我来也、JohnT3e、白华等同学,积极在留言区讨论学习和实践中的问题,也分享了宝贵的经验,在这里也非常感谢你们。
今天是性能优化的第三期。照例,我从内存模块的留言中摘出了一些典型问题,作为今天的答疑内容,集中回复。为了便于你学习理解,它们并不是严格按照文章顺序排列的。
每个问题,我都附上了留言区提问的截屏。如果你需要回顾内容原文,可以扫描每个问题右下方的二维码查看。

问题 1:内存回收与 OOM

虎虎的这个问题,实际上包括四个子问题,即,
怎么理解 LRU 内存回收?
回收后的内存又到哪里去了?
OOM 是按照虚拟内存还是实际内存来打分?
怎么估计应用程序的最小内存?
其实在 Linux 内存的原理篇Swap 原理篇中我曾经讲到,一旦发现内存紧张,系统会通过三种方式回收内存。我们来复习一下,这三种方式分别是 :
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Linux性能优化实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(28)

  • 白华
    自己跑虚拟机跑的k8s小集群,node节点跑的镜像太多,就特别卡,看集群情况发现好多pod都死了,看虚拟机上面就写到oom自动杀进程了,以前从没遇到过oom,这次一下就知道怎么回事了

    作者回复: 😊 k8s别忘了设置好内存资源的请求和限制

    2019-01-09
    6
  • 陳先森
    很多同学装bcc工具的时候都提示找不到动态库之类的,经过本人亲测是因为没有安装匹配新内核版本的内核头包。我的系统centos7.3更新了之后内核是5.0.5版本的,升完之后一直提示缺少库文件,我的做法是
    rpm -qa |grep kerner,先查找系统内核版本,网上查找相应的匹配kerner-devel包,及时没有相同版本也不要紧,比如5.0.5-1的版本就是我系统的版本网上找了没有这个版本对应的kerner-devel包但是不知道为什么升级了会安装这个版本,我系统升级前centos7.3,升级后7.6。我就下载了5.0.5-3并安装,然后版本的,找到对应的包版本,rpm -ql 包版本,做个软连接就OK。至此bcc已经安装完成。做为一个linux运维我都装了2天,可想而知大家。此方法亲测centos7.3

    作者回复: 👍谢谢分享

    2019-04-05
    2
    2
  • 好好学习
    内存统计这样也可以吧smem|awk '{total+=$7};END{printf "%d kb/n",total}'

    作者回复: smem是可以的👍,不过要注意计算 PSS 而不是 RSS

    2019-01-13
    2
  • wykkx
    老师您好,请教一个问题,您说匿名页回收是使用swap机制,那么这里有几个问题:一是如果我的系统不开启swap(现在很多系统都是不开启swap的,尤其是web类应用,为了提升响应时间),那么匿名页还怎么回收?二是即使我开启了swap,匿名页被放到了swap上,那么swap是如何清理这些匿名页的,总不能一致保存这些匿名页吧。谢谢老师
    2019-01-10
     作者回复
    1. 不开swap,没法回收
    2. 取决于这些页的实际访问情况,只要一访问,就会换入到内存中
    ---------追问-------------------------
    首先谢谢老师的问答,可能是我没有描述清楚。一是,如果按照老师说的“不开swap,没法回收”那么我系统产生的大量匿名页怎么办?是不是一直在内存里,不能被回收?直到引发oom,把这个进程干掉?;二是“ 取决于这些页的实际访问情况,只要一访问,就会换入到内存中”如果这些被换到swap上的匿名页量很大 ,把swap都写满了,这个时候是怎么选择从swap里清理哪些匿名页呢?

    作者回复: 1.是的;2. swap都满了,说明内存也耗尽了呀,这时候就要OOM了

    2019-01-12
    2
  • cuikt
    bcc-tool 确实厉害,无奈生成环境不可能轻易升级内核,只能学习使用。
    2019-05-06
    1
  • 划时代
    老师,在“如何统计所有进程的物理内存使用量”的问题中,我曾尝试将/proc/[pid]/smaps中的项Pss相加,但发现一个进程中有多个地址段的Pss为0kB,而Rss是不为0kB的,该区域占用了物理内存却没有计算在Pss内,表示不太理解?

    作者回复: 什么进程?

    2019-01-09
    1
  • ninuxer
    打卡day23
    喜欢一篇文章看两次,第一次看,第二次是实践的时候再看一遍

    作者回复: 👍

    2019-01-09
    1
  • hana
    打卡
    2019-11-07
  • 风清扬
    问题五我认为有问题,不知道是不是理解错了。
    最开始写法存在内存泄露,我认为也是有问题的,返回值是v,类型long long *,那么解引用拿到的还是long long,另外多申请的1023个long long 有啥用????

    郭江伟的解法,是一个long long v[1024],返回值类型long long,返回什么?返回v[0]吗,那剩下的存的什么?
    2019-09-13
  • 饭粒
    原来更新内核后可以直接yum安装bcc,不用挨个安装llvm等依赖太好了,赞。
    2019-09-01
  • JJj
    OOM 触发的时机基于虚拟内存。换句话说,进程在申请内存时,如果申请的虚拟内存加上服务器实际已用的内存之和---这里的实际已使用内存是不是对应free里面的used

    作者回复: 应该是buff/cache+used,参考问题1的第三种方式,先尝试回收内存然后才是OOM

    2019-06-29
  • 小松松
    老师,请教个问题。 文件页和匿名页是什么呢? 看书上说的很懵,希望老师能举个实际用途的例子讲解下。

    作者回复: 请参考 19 | 案例篇:为什么系统的Swap变高了

    2019-05-08
  • H&HH
    老师,初始系统版本是centos7.3,按照你给的安装bcc-tools步骤安装完后还是出现了以下报错,请问老师怎么回事呀
    [root@server tools]# ./cachetop
    Traceback (most recent call last):
      File "./cachetop", line 21, in <module>
        from bcc import BPF
      File "/usr/lib/python2.7/site-packages/bcc/__init__.py", line 27, in <module>
        from .libbcc import lib, bcc_symbol, bcc_symbol_option, _SYM_CB_TYPE
      File "/usr/lib/python2.7/site-packages/bcc/libbcc.py", line 17, in <module>
        lib = ct.CDLL("libbcc.so.0", use_errno=True)
      File "/usr/lib64/python2.7/ctypes/__init__.py", line 360, in __init__
        self._handle = _dlopen(self._name, mode)
    OSError: /opt/lampp/lib/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by /lib64/libbcc.so.0)
    [root@server tools]# uname -r
    5.0.3-1.el7.elrepo.x86_64
    [root@server tools]# cat /etc/redhat-release
    CentOS Linux release 7.6.1810 (Core)

    作者回复: 看错误是找不到依赖的动态链接库,可以试试修复安装 libstdc++

    2019-03-22
  • lin
    打卡:
    bcc-tools install(centos6.9) 已尝试可以顺利安装
    https://blog.csdn.net/luckgl/article/details/88355074

    作者回复: 谢谢分享

    2019-03-12
  • LotusChing
    老师,您对wykkx同学问题的回答我有些不理解,"不开swap,没法回收匿名页。",我自己用tomcat容器做了个小实验。

    环境:Ubuntu 14.04.1 LTS, Trusty Tahr,3.13.0-128-generic,docker 17.12.0-ce,tomcat:8-alpine

    我的环境没有启用swap(free看到的都是0),通过启停tomcat容器,并观察/proc/zoneinfo、/proc/meminfo中anon相关匿名页相关指标,发现这些指标数值会随着启停容器上下浮动。

    这样,是不是说明应用占用的匿名页只有在退出时释放?那应用运行过程中使用到的内存如何释放呢?通过GC么?

    希望老师能抽空回复下关于我们的这个问题么,感谢!

    作者回复: 停止进程后当然是会释放进程所占用的内存。我说的是进程一直在运行中的时候,进程自己分配的内存只能进程自己来释放,或者等着进程推出后由系统释放。

    2019-02-16
  • 如果
    day22,打卡
    2019-02-13
  • 我的现象是32G服务器 free 还有2g多出现oom,但并没有容器的内存升高。
    进程申请的虚拟内存 + 服务器已用的内存(包括buf/cache) > 物理内存 的时候会触发OOM

    那们我个人理解OOM 发生以后会出现某个进程内存飙升的情况,但从OOM对应的时间上来看,监控没有发现某个容器进程飙升。 不知道是为什么?



    ubuntu 16.04
    sar -r -S 1 %commit 与 free -g 里面又该如何对应呢?

    作者回复: 使用容器的话,内存可能还受到cgroups的限制。这时候容器OOM只代表容器的内存达到了limit,不代表系统内存使用情况。另外,进程的内存使用不一定是飙升,还有可能缓慢增长(其实大部分内存泄漏都是这样).

    %commit跟free没有对应关系,commit是一个动态计算出来的估计值

    2019-02-01
  • marvinren
    我有个问题有点没弄明白,从实验角度上讲,进入cache和buffer的文件页,也会会被swap回收,对么?

    作者回复: 不会的,swap回收的是匿名页

    2019-02-01
  • wykkx
    老师您好,打扰了,我追问的内容麻烦您抽空回答下:
    ---------追问-------------------------
    首先谢谢老师的问答,可能是我没有描述清楚。一是,如果按照老师说的“不开swap,没法回收”那么我系统产生的大量匿名页怎么办?是不是一直在内存里,不能被回收?直到引发oom,把这个进程干掉?;二是“ 取决于这些页的实际访问情况,只要一访问,就会换入到内存中”如果这些被换到swap上的匿名页量很大 ,把swap都写满了,这个时候是怎么选择从swap里清理哪些匿名页呢?
    谢谢
    2019-01-15
  • ddel_07
    老师,有没有检查栈溢出的工具?因为之前有一个很深调用栈的函数发生了入参不可访问的段错误,所以想查查是不是可能是栈溢出了,但一直没找到合适的工具。

    作者回复: 栈溢出程序会直接报错的

    2019-01-14
收起评论
28
返回
顶部