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性能优化实战
登录|注册

19 | 案例篇:为什么系统的Swap变高了(上)

倪朋飞 2019-01-02
你好,我是倪朋飞。
上一节,我通过一个斐波那契数列的案例,带你学习了内存泄漏的分析。如果在程序中直接或间接地分配了动态内存,你一定要记得释放掉它们,否则就会导致内存泄漏,严重时甚至会耗尽系统内存。
不过,反过来讲,当发生了内存泄漏时,或者运行了大内存的应用程序,导致系统的内存资源紧张时,系统又会如何应对呢?
在内存基础篇我们已经学过,这其实会导致两种可能结果,内存回收和 OOM 杀死进程。
我们先来看后一个可能结果,内存资源紧张导致的 OOM(Out Of Memory),相对容易理解,指的是系统杀死占用大量内存的进程,释放这些内存,再分配给其他更需要的进程。
这一点我们前面详细讲过,这里就不再重复了。
接下来再看第一个可能的结果,内存回收,也就是系统释放掉可以回收的内存,比如我前面讲过的缓存和缓冲区,就属于可回收内存。它们在内存管理中,通常被叫做文件页(File-backed Page)。
大部分文件页,都可以直接回收,以后有需要时,再从磁盘重新读取就可以了。而那些被应用程序修改过,并且暂时还没写入磁盘的数据(也就是脏页),就得先写入磁盘,然后才能进行内存释放。
这些脏页,一般可以通过两种方式写入磁盘。
可以在应用程序中,通过系统调用 fsync ,把脏页同步到磁盘中;
也可以交给系统,由内核线程 pdflush 负责这些脏页的刷新。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Linux性能优化实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(49)

  • shellmode
    关于上面有同学表示 hadoop 集群建议关 swap 提升性能。事实上不仅 hadoop,包括 ES 在内绝大部分 Java 的应用都建议关 swap,这个和 JVM 的 gc 有关,它在 gc 的时候会遍历所有用到的堆的内存,如果这部分内存是被 swap 出去了,遍历的时候就会有磁盘IO

    可以参考这两篇文章:
    https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-configuration-memory.html

    https://dzone.com/articles/just-say-no-swapping

    作者回复: 嗯嗯,大部分应用都不需要swap

    2019-01-22
    22
  • 爱学习的小学生
    请问老师、为什么kubernetes要关闭swap呢?

    作者回复: 一个是性能问题,开启swap会严重影响性能(包括内存和I/O);另一个是管理问题,开启swap后通过cgroups设置的内存上限就会失效。

    2019-02-21
    11
  • 石头
    hadoop集群服务器一般是建议关闭swap交换空间,这样可提高性能。在什么情况下开swap、什么情况下关swap?
    2019-01-02
    11
  • bob
    swappiness=0
    Kernel version 3.5 and newer: disables swapiness.
    Kernel version older than 3.5: avoids swapping processes out of physical memory for as long as possible.
    如果linux内核是3.5及以后的,最好是设置swappiness=10,不要设置swappiness=0

    以前整理的说明,供大家参考。

    作者回复: 谢谢分享

    2019-01-03
    6
  • 某、人
    swap应该是针对以前内存小的一种优化吧,不过现在内存没那么昂贵之后,所以就没那么大的必要开启了
    numa感觉是对系统资源做的隔离分区,不过目前虚拟化和docker这么流行。而且node与node之间访问更耗时,针对大程序不一定启到了优化作用,针对小程序,也没有太大必要。所以numa也没必要开启。
    不知道我的理解对否,老师

    作者回复: 对的

    2019-01-02
    6
  • 路过
    老师,前面你写只有当剩余内存落在页最小阈值和页低阈值中间,才开始回收内存。后面讲即使把 swappiness 设置为0,当剩余内存 + 文件页小于页高阈值时,还是会发生 Swap。我理解,这里是不是应该是:当剩余内存 + 文件页小于页低阈值时,还是会发生 Swap。谢谢!

    作者回复: 阈值的比较只代表回收内存的时机,具体回收哪些内存才是swappiness的目的,但是swappiness只是个倾向,而非绝对值

    2019-01-03
    1
    3
  • 我来也
    [D19打卡]
    很遗憾,还未遇到过swap导致的性能问题.
    刚买电脑时,512M内存要四百多,可是当时也不玩linux.
    等工作了,用linux了,内存相对来说已经比较便宜了.
    现在就更不用说了,基本小钱能解决的问题都不是问题了.
    --------------------
    以前的程序喜欢在启动时预分配很多内存,可是现在的几乎都是动态分配了.
    以前一个程序动辄实际使用内存2-3G.
    现在即使重构后,只需要100M内存,老板都不愿意换了.[稳定第一]

    作者回复: 👍

    2019-01-02
    3
  • 一坛幽梦
    老师,在工作中经常会遇到这种情况,系统中的剩余内存较小、缓存内存较大的,也就是整体可用内存较高的情况下,就开始使用swap了,而查看swappiness的配置为10,理论上不应该使用swap的;具体看下面的free命令,麻烦老师看下是什么原因?
    [root@shvsolman ~]# free -m
                 total used free shared buffers cached
    Mem: 32107 31356 750 0 15 12514
    -/+ buffers/cache: 18825 13281
    Swap: 3071 1581 1490
    [root@shvsolman ~]# sysctl -a | grep swappiness
    vm.swappiness = 10

    作者回复: 这是容易误解的地方,其实,即使把swappiness设置成0也不会禁止swap。想要禁止,就不要开启swap。

    2019-03-11
    2
  • 日行一善520
    看到评论有人问
    hadoop集群服务器一般是建议关闭swap交换空间,这样可提高性能。在什么情况下开swap、什么情况下关swap?

    为了性能关闭swap,这样就不会交换也不会慢了。内核里有个vm.xx的值可以调节swap和内存的比例,在使用内存90%时才交换到swap,可以设置这个来保持性能。在内存比较少的时候,还可以交换,就好了。

    作者回复: 谢谢分享

    2019-01-16
    2
  • 2xshu
    非常感谢老师的课程。让我受益匪浅。
    老师,我还有两个问题,想请教。
    1:zone_reclaim_mode设置成1,也即是开启zone reclaim。此时当内存即是低于water 水位的low值,是不是也得需要满足min_unmapped_ratio所给的百分比才会让kswapd0/1开始内存回收?
    (实际场景,zone内存小于low,kswapd0/1确实没有调用。 不知道是不是和min_unmapped_ratio有关系.)
    2:min_unmapped_ratio官网解释如下:
    This is available only on NUMA kernels.

    This is a percentage of the total pages in each zone. Zone reclaim will
    only occur if more than this percentage of pages are in a state that
    zone_reclaim_mode allows to be reclaimed.

    If zone_reclaim_mode has the value 4 OR'd, then the percentage is compared
    against all file-backed unmapped pages including swapcache pages and tmpfs
    files. Otherwise, only unmapped pages backed by normal files but not tmpfs
    files and similar are considered.

    The default is 1 percent.

    我自己理解是/proc/pagetypeinfo中Reclaimable所占的页数需要达到该zone总页数的百分比,才会真正回收内存?
    希望得到老师的解答。谢谢。
    2019-01-02
    2
  • MJ
    老师,可否认为匿名页就是堆内存和共享内存?两者都是应用程序控制
    2019-06-15
    1
  • 13001236383
    除了缓存和缓冲区,通过内存映射获取的文件映射页,也是一种常见的文件页。这个和缓存和缓冲中的文件页有啥区别了
    2019-01-17
    1
  • 划时代
    最近碰到内存打满,瞬间导致系统负载和CPU使用率打满的情况。

    作者回复: 解决了没?

    2019-01-03
    1
  • 爆爱渣科_无良🌾 🐖
    感觉后面越写越变成讲述linux工具的文章。。。

    作者回复: 案例篇都会介绍一些常用的性能工具,用好工具事半功倍。当然,如果你有更好的方法,也欢迎分享

    2019-01-02
    1
  • Days
    我们公司处理嵌入式系统都是关闭swap分区,具体不知道什么原因?

    作者回复: 一般是为了减少写的次数,延长Flash存储的寿命

    2019-01-02
    1
  • React
    老师好,文中说电脑的休眠是基于swap.如果系统没有分配swap分区,还会将内存数据写入磁盘吗

    作者回复: 除了分区之外,也可以用文件

    2019-01-02
    1
  • DJH
    倪老师,请教一下,Linux下怎么关闭SWAP功能?直接不分配SWAP卷(或者分区、文件),还是通过某个关闭SWAP功能的系统选项?

    作者回复: swapoff命令可以动态关闭,持久化还要从fstab里面删除

    2019-01-02
    1
  • ninuxer
    打卡day20
    我们机器上,都不启用swap😂

    作者回复: 我的也是😊

    2019-01-02
    1
  • ouyangsheng
    内存回收包括:1文件页面既cache buffer直接清除或是脏页回写再清除;2匿名页面既malloc分配的可以通过swap换到硬盘。

    回收的阈值可以在sys中调整watermark
    2019-11-30
  • weilai
    从这里入门去看了下内核的书,发现,这个专栏其实就是在讲内核的原理在性能调优实战中的运用。非常好,之前直接看内核原理书籍头皮发麻,现在可以看懂了!感谢大佬!!!
    2019-11-24
收起评论
49
返回
顶部