Linux性能优化实战-极客课程笔记(3)

简介: Linux性能优化实战-极客课程笔记(3)

11 | 答疑(二):如何用perf工具分析Java程序?

pidstat 中, %wait 表示进程等待 CPU 的时间百分比。

top 中 ,iowait% 则表示等待 I/O 的 CPU 时间百分比。

bindfs 的基本功能是实现目录绑定(类似于 mount --bind

Ubuntu 上的安装方法是下面这样:


apt−getinstall−ylinux−tools−commonlinux−tools−genericlinux−tools− apt-get install -y linux-tools-common linux-tools-generic linux-tools-


aptgetinstallylinuxtoolscommonlinuxtoolsgenericlinuxtools(uname -r))


而在 php-fpm 容器里,你应该执行下面的命令来安装 perf:

$ apt-get install -y linux-perf


perf report 是一个可视化展示 perf.data 的工具


12 | 基础篇:Linux 内存是怎么工作的?


[root@VM-0-8-centos ~]# free

total used free shared buff/cache available

Mem: 1873428 694684 215732 6788 963012 997180

Swap: 0 0 0


第一列,total 是总内存大小;

第二列,used 是已使用内存的大小,包含了共享内存;

第三列,free 是未使用内存的大小;

第四列,shared 是共享内存的大小;

第五列,buff/cache 是缓存和缓冲区的大小;

最后一列,available 是新进程可用内存的大小。


top 输出界面的顶端,也显示了系统整体的内存使用情况,这些数据跟 free 类似,我就不再重复解释。我们接着看下面的内容,跟内存相关的几列数据,比如 VIRT、RES、SHR 以及 %MEM 等。


VIRT 是进程虚拟内存的大小,只要是进程申请过的内存,即便还没有真正分配物理内存,也会计算在内。


RES 是常驻内存的大小,也就是进程实际使用的物理内存大小,但不包括 Swap 和共享内存。


SHR 是共享内存的大小,比如与其他进程共同使用的共享内存、加载的动态链接库以及程序的代码段等。


%MEM 是进程使用物理内存占系统总内存的百分比。


第一,虚拟内存通常并不会全部分配物理内存。从上面的输出,你可以发现每个进程的虚拟内存都比常驻内存大得多。


第二,共享内存 SHR 并不一定是共享的,比方说,程序的代码段、非共享的动态链接库,也都算在 SHR 里。当然,SHR 也包括了进程间真正共享的内存。所以在计算多个进程的内存使用时,不要把所有进程的 SHR 直接相加得出结果。


13 | 基础篇:怎么理解内存中的Buffer和Cache?


用 man 命令查询 free 的文档,就可以找到对应指标的详细说明。

# 清理文件页、目录项、Inodes等各种缓存


$ echo 3 > /proc/sys/vm/drop_caches


这里的 /proc/sys/vm/drop_caches ,就是通过 proc 文件系统修改内核行为的一个示例,写入 3 表示清理文件页、目录项、Inodes 等各种缓存


# 每隔1秒输出1组数据

$ vmstat 1

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----

r b swpd free buff cache si so bi bo in cs us sy id wa st

0 0 0 7743608 1112 92168 0 0 0 0 52 152 0 1 100 0 0

0 0 0 7743608 1112 92168 0 0 0 0 36 92 0 0 100 0 0

buff 和 cache 就是我们前面看到的 Buffers 和 Cache,单位是 KB。

bi 和 bo 则分别表示块设备读取和写入的大小,单位为块 / 秒。因为 Linux 中块的大小是 1KB,所以这个单位也就等价于 KB/s。

接下来,到第二个终端执行 dd 命令,通过读取随机设备,生成一个 500MB 大小的文件:


$ dd if=/dev/urandom of=/tmp/file bs=1M count=500

然后再回到第一个终端,观察 Buffer 和 Cache 的变化情况:

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----


r b swpd free buff cache si so bi bo in cs us sy id wa st

0 0 0 7499460 1344 230484 0 0 0 0 29 145 0 0 100 0 0

1 0 0 7338088 1752 390512 0 0 488 0 39 558 0 47 53 0 0

1 0 0 7158872 1752 568800 0 0 0 4 30 376 1 50 49 0 0

1 0 0 6980308 1752 747860 0 0 0 0 24 360 0 50 50 0 0

0 0 0 6977448 1752 752072 0 0 0 0 29 138 0 0 100 0 0

0 0 0 6977440 1760 752080 0 0 0 152 42 212 0 1 99 1 0

...

0 1 0 6977216 1768 752104 0 0 4 122880 33 234 0 1 51 49 0

0 1 0 6977440 1768 752108 0 0 0 10240 38 196 0 0 50 50 0


通过观察 vmstat 的输出,我们发现,在 dd 命令运行时, Cache 在不停地增长,而 Buffer 基本保持不变。


在 Cache 刚开始增长时,块设备 I/O 很少,bi 只出现了一次 488 KB/s,bo 则只有一次 4KB。而过一段时间后,才会出现大量的块设备写,比如 bo 变成了 122880。当 dd 命令结束后,Cache 不再增长,但块设备写还会持续一段时间,并且,多次 I/O 写的结果加起来,才是 dd 要写的 500M 的数据。


Buffer 既可以用作“将要写入磁盘数据的缓存”,也可以用作“从磁盘读取数据的缓存”。Cache 既可以用作“从文件读取数据的页缓存”,也可以用作“写文件的页缓存”。


,Buffer 是对磁盘数据的缓存,而 Cache 是文件数据的缓存,它们既会用在读请求中,也会用在写请求中。


从写的角度来说,不仅可以优化磁盘和文件的写入,对应用程序也有好处,应用程序可以在数据真正落盘前,就返回去做其他工作。从读的角度来说,既可以加速读取那些需要频繁访问的数据,也降低了频繁 I/O 对磁盘的压力。


$ vmstat 1

proc 文件系统也是我们的好帮手。它为我们呈现了系统内部的运行状态,同时也是很多性能工具的数据来源,是辅助排查性能问题的好方法。


14 | 案例篇:如何利用系统缓存优化程序的运行效率?


Buffers 和 Cache 可以极大提升系统的 I/O 性能。通常,我们用缓存命中率,来衡量缓存的使用效率。命中率越高,表示缓存被利用得越充分,应用程序的性能也就越好。你可以用 cachestat 和 cachetop 这两个工具,观察系统和进程的缓存命中情况。其中,cachestat 提供了整个系统缓存的读写命中情况。cachetop 提供了每个进程的缓存命中情况。不过要注意,Buffers 和 Cache 都是操作系统来管理的,应用程序并不能直接控制这些缓存的内容和生命周期。所以,在应用程序开发中,一般要用专门的缓存组件,来进一步提升性能。比如,程序内部可以使用堆或者栈明确声明内存空间,来存储需要缓存的数据。再或者,使用 Redis 这类外部缓存服务,优化数据的访问效率。


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


Linux 的 Swap 机制。Swap 把这些不常访问的内存先写到磁盘中,然后释放这些内存,给其他更需要的进程使用。再次访问这些内存时,重新从磁盘读入内存就可以了。


实际上,前面提到的三个内存阈值(页最小阈值、页低阈值和页高阈值),都可以通过内存域在 proc 文件系统中的接口 /proc/zoneinfo 来查看。


pages 处的 min、low、high,就是上面提到的三个内存阈值,而 free 是剩余内存页数,它跟后面的 nr_free_pages 相同。


nr_zone_active_anon 和 nr_zone_inactive_anon,分别是活跃和非活跃的匿名页数。nr_zone_active_file 和 nr_zone_inactive_file,分别是活跃和非活跃的文件页数。剩余内存远大于页高阈值,所以此时的 kswapd0 不会回收内存。


通过 /proc/sys/vm/zone_reclaim_mode 来调整。它支持以下几个选项:默认的 0 ,也就是刚刚提到的模式,表示既可以从其他 Node 寻找空闲内存,也可以从本地回收内存。1、2、4 都表示只回收本地内存,2 表示可以回写脏数据回收内存,4 表示可以用 Swap 方式回收内存。


swappiness 的范围是 0-100,数值越大,越积极使用 Swap,也就是更倾向于回收匿名页;数值越小,越消极使用 Swap,也就是更倾向于回收文件页。虽然 swappiness 的范围是 0-100,不过要注意,这并不是内存的百分比,而是调整 Swap 积极程度的权重,即使你把它设置成 0,当剩余内存 + 文件页小于页高阈值时,还是会发生 Swap。


大部分应用都不需要swap


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

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


目录
相关文章
|
1月前
|
Ubuntu Linux Python
Tkinter错误笔记(一):tkinter.Button在linux下出现乱码
在Linux系统中,使用Tkinter库时可能会遇到中文显示乱码的问题,这通常是由于字体支持问题导致的,可以通过更换支持中文的字体来解决。
128 0
Tkinter错误笔记(一):tkinter.Button在linux下出现乱码
|
22天前
|
存储 缓存 监控
|
1月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
86 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
2月前
|
监控 Linux Shell
30 个实用的 Linux 命令贴与技巧,提升你的效率(附实战案例)
本文介绍了30个实用的Linux命令及其应用场景,帮助你提升命令行操作效率。涵盖返回目录、重新执行命令、查看磁盘使用情况、查找文件、进程管理、网络状态监控、定时任务设置等功能,适合各水平的Linux用户学习和参考。
|
3月前
|
Unix Linux 开发工具
linux笔记 diff及patch的制作与使用
这篇文章是关于Linux系统中使用`diff`命令生成补丁文件以及使用`patch`命令应用这些补丁的详细教程和实战案例。
92 2
linux笔记 diff及patch的制作与使用
|
3月前
|
Linux 文件存储 数据安全/隐私保护
Linux用户组管理实战:创建、管理与删除的全面指南
在 Linux 系统中,用户组管理是实现权限控制和资源共享的关键。本文档详细介绍如何创建用户组、管理用户组成员及查看与删除用户组。首先,通过 `groupadd` 命令创建新用户组,并在 `/etc/group` 文件中记录。接着,利用 `usermod` 和 `gpasswd` 命令来添加或删除用户组成员,其中 `gpasswd` 提供更灵活的管理方式。最后,使用 `getent` 或直接读取 `/etc/group` 查看用户组信息,并通过 `groupdel` 删除空用户组。这些操作有助于高效管理和保护系统资源。
313 4
|
3月前
|
缓存 监控 Linux
在Linux中,如何进行系统性能优化?
在Linux中,如何进行系统性能优化?
|
3月前
|
数据采集 Linux
Linux源码阅读笔记20-PCI设备驱动详解
Linux源码阅读笔记20-PCI设备驱动详解
|
3月前
|
Linux
Linux源码阅读笔记19-插入删除模块实战
Linux源码阅读笔记19-插入删除模块实战
|
3月前
|
Ubuntu Linux Shell
【linux】PetaLinux 2024.1安装笔记
【linux】PetaLinux 2024.1安装笔记
228 0