Linux调优指南

更多相关知识可以阅读:
https://www.yuque.com/treblez/qksu6c/yxl59pkvczqot9us
https://www.yuque.com/treblez/qksu6c/nqe8ip59cwegl6rk
本文不会讲解基础知识。

CPU

设置调度器

image.png
这几个调度类的优先级如下:Deadline > Realtime > Fair
如果你的某些任务对延迟容忍度很低,比如说在嵌入式系统中就有很多这类任务,那就可以考虑将你的任务设置为实时任务,比如将它设置为 SCHED_FIFO 的任务:$ chrt -f -p 1 1327

使用perf制作火焰图

这里使用FlameGraph这个库(https://github.com/brendangregg/FlameGraph)进行火焰图的绘制

#设置采样率 
export CPUPROFILE_FREQUENCY=4000
export PATH=$PATH:path-to-FlameGraph
#采样
sudo perf record -a -g -F99 --call-graph dwarf -p 51568
sudo perf script > perf.script
sudo stackcollapse-perf.pl perf.script > workrun.floded
sudo flamegraph.pl workrun.floded > workrun.svg

观测cpu指标

  1. top命令

image.png

  1. 使用perf观测 CPU Utilization、cycles 和 IPC

分析系统调用

strace 可以跟踪进程的系统调用、特定的系统调用以及系统调用的执行时间。很多时候,我们通过系统调用的执行时间,就能判断出业务延迟发生在哪里。
比如我们想要跟踪一个多线程程序的系统调用情况,那就可以这样使用 strace:

$ strace -T -tt -ff -p pid -o strace.out

image.png

内存

观测内存占用

page cache由mmap io和buffered io产生,由内核管理。
image.png
在 Linux 上直接查看 Page Cache 的方式有很多,包括** /proc/meminfo、free 、/proc/vmstat **命令等,它们的内容其实是一致的。
公式1:Buffers + Cached + SwapCached = Active(file) + Inactive(file) + Shmem + SwapCached

  • SwapCached 是在打开了 Swap 分区后,把 Inactive(anon)+Active(anon) 这两项里的匿名页给交换到磁盘(swap out),然后再读入到内存(swap in)后分配的内存。
  • Page Cache 中的 Shmem 是指匿名共享映射这种方式分配的内存(free 命令中 shared 这一项),比如 tmpfs(临时文件系统[它是一种内存文件系统,只存在于内存中,它无需应用程序去申请和释放内存,而是操作系统自动来规划好一部分空间,应用程序只需要往这里面写入数据就可以了,这样会很方便])、Slab(高速缓存)、KernelStack(内核栈)和 VmallocUsed(内核通过 vmalloc 申请的内存) 这些都是内核分配的,而不是应用程序mmap产生的内存。

公式2:free命令中的buff/cache = Buffers + Cached + SReclaimable

  • SReclaimable 是指可以被回收的内核内存,包括 dentry 和 inode 等。
  • VFS有四个主要对象:超级块对象,对应打开的文件系统;索引节点对象,对应一个具体文件;目录项对象,代表一个路径;文件对象,代表进程打开的文件。可能占用内存较大并且可以被回收的就是索引节点对象inode和目录项对象dentry。

定位内存问题

  1. 观察vmstat指标

image.png

  1. 使用tracepoint

image.png

#首先来使能compcation相关的一些tracepoing
$ echo 1 >
/sys/kernel/debug/tracing/events/compaction/mm_compaction_begin/enable
$ echo 1 >
/sys/kernel/debug/tracing/events/compaction/mm_compaction_end/enable #然后来读取信息,当compaction事件触发后就会有信息输出
$ cat /sys/kernel/debug/tracing/trace_pipe<...>-49355 [037] .... 1578020.975159: mm_compaction_begin: 
zone_start=0x2080000 migrate_pfn=0x2080000 free_pfn=0x3fe5800 
zone_end=0x4080000, mode=async<...>-49355 [037] .N.. 1578020.992136: mm_compaction_end: 
zone_start=0x2080000 migrate_pfn=0x208f420 free_pfn=0x3f4b720 
zone_end=0x4080000, mode=async status=contended

观测脏页和内存回收行为

使用vmstat观察脏页数量

$ cat /proc/vmstat | egrep "dirty|writeback"nr_dirty 40nr_writeback 2

内存回收流程
image.png
观察 Page Cache 直接回收和后台回收最简单方便的方式是使用 sar:

$ sar -B 1
02:14:01 PM  pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff02:14:01 PM      0.14    841.53 106745.40      0.00  41936.13      0.00      0.00      0.00      0.00
02:15:01 PM      5.84    840.97  86713.56      0.00  43612.15    717.81      0.00    717.66     99.98
02:16:01 PM     95.02    816.53 100707.84      0.13  46525.81   3557.90      0.00   3556.14     99.95
02:17:01 PM     10.56    901.38 122726.31      0.27  54936.13   8791.40      0.00   8790.17     99.99
02:18:01 PM    108.14    306.69  96519.75      1.15  67410.50  14315.98     31.48  14319.38     99.80
02:19:01 PM      5.97    489.67  88026.03      0.18  48526.07   1061.53      0.00   1061.42     99.99

下面是这些指标的具体含义:

  • pgscank/s : kswapd(后台回收线程) 每秒扫描的 page 个数。
  • pgscand/s: Application 在内存申请过程中每秒直接扫描的 page 个数。
  • pgsteal/s: 扫描的 page 中每秒被回收的个数。
  • %vmeff: pgsteal/(pgscank+pgscand), 回收效率,越接近 100 说明系统越安全,越接近 0 说明系统内存压力越大。

加快内存页回收

内存页回收的原理
image.png
调整内存水位
当内存水位低于 watermark low 时,就会唤醒 kswapd 进行后台回收,然后 kswapd 会一直回收到 watermark high。
我们可以增大 min_free_kbytes 这个配置选项来及早地触发后台回收,该选项最终控制的是内存回收水位,对于大于等于 128G 的系统而言,将 min_free_kbytes 设置为 4G 比较合理,这是我们在处理很多这种问题时总结出来的一个经验值,既不造成较多的内存浪费,又能避免掉绝大多数的直接内存回收。
该值的设置和总的物理内存并没有一个严格对应的关系,我们在前面也说过,如果配置不当会引起一些副作用,所以在调整该值之前,我的建议是:你可以渐进式地增大该值,比如先调整为 1G,观察 sar -B 中 pgscand 是否还有不为 0 的情况;如果存在不为 0 的情况,继续增加到 2G,再次观察是否还有不为 0 的情况来决定是否增大,以此类推。
调整脏页的个数
可以通过调小如下设置来将系统脏页个数控制在一个合理范围:

vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 10
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 3000
vm.dirty_ratio = 20

调整这些配置项有利有弊,调大这些值会导致脏页的积压,但是同时也可能减少了 I/O 的次数,从而提升单次刷盘的效率;调小这些值可以减少脏页的积压,但是同时也增加了 I/O 的次数,降低了 I/O 的效率。

手动回收slab

slab中很大一部分数据是inode:
image.png
内核提供了如下方法来释放slab:
image.png
这里注意inode回收的副作用在于对应文件的radix tree中的page cache也会被回收掉,为了避免这种情况,对于重要的数据,可以通过 mlock(2) 来保护它,防止被回收以及被 drop;对于不重要的数据(比如日志),那可以通过 madvise(2) 告诉内核来立即释放这些 Page Cache。

观察进程内存

  1. 通过top观察整个进程的内存占用

image.png

  1. 通过pmap观察线性地址空间分配
$  pmap -x `pidof sshd`
Address           Kbytes     RSS   Dirty Mode  Mapping 
000055e798e1d000     768     652       0 r-x-- sshd
000055e7990dc000      16      16      16 r---- sshd
000055e7990e0000       4       4       4 rw--- sshd
000055e7990e1000      40      40      40 rw---   [ anon ]
...
00007f189613a000    1800    1624       0 r-x-- libc-2.17.so
00007f18962fc000    2048       0       0 ----- libc-2.17.so
00007f18964fc000      16      16      16 r---- libc-2.17.so
00007f1896500000       8       8       8 rw--- libc-2.17.so
...
00007ffd9d30f000     132      40      40 rw---   [ stack ]
...
  • Mapping,用来表示文件映射中占用内存的文件,比如 sshd 这个可执行文件,或者堆[heap],或者栈[stack],或者其他,等等。
  • Mode,它是该内存的权限,比如,“r-x”是可读可执行,它往往是代码段 (Text Segment);“rw-”是可读可写,这部分往往是数据段 (Data Segment);“r–”是只读,这往往是数据段中的只读部分。
  • Address、Kbytes、RSS、Dirty,Address 和 Kbytes 分别表示起始地址和虚拟内存的大小,RSS(Resident Set Size)则表示虚拟内存中已经分配的物理内存的大小,Dirty 则表示内存中数据未同步到磁盘的字节数。

分析内存泄漏

内存泄漏主要通过meminfo入手:
image.png

磁盘

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/478723.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【OpenAI发布Sora视频模型,高保真AI视频成真了!】

曾梦想执剑走天涯&#xff0c;我是程序猿【AK】 目录 简述概要Sora技术报告总结 简述概要 隆重介绍 Sora&#xff0c;文本转视频模型。Sora 可以生成长达一分钟的视频&#xff0c;同时保持视觉质量并遵守用户的提示。又是哪些职业要被AI替代了&#xff01; Sora技术报告 作为…

Error creating bean with name ‘formContentFilter‘ defined in class path

问题描述 运行之前能正常的项目出现以上报错&#xff0c;提示创建“formContentFilter”时错误&#xff1b;org.springframework.boot版本2.4.8 org.springframework.beans.factory.BeanCreationException. Message: Error creating bean with name formContentFilter define…

【医学大模型 补全主诉】BioGPT + LSTM 自动补全医院紧急部门主诉

BioGPT LSTM 自动补全医院紧急部门主诉 问题&#xff1a;针对在紧急部门中自动补全主诉的问题子问题1: 提高主诉记录的准确性子问题2: 加快主诉记录的速度子问题3: 统一医疗术语的使用子问题4: 减少打字错误和误解子问题5: 提高非特定主诉的处理能力 解法数据预处理神经网络方…

【MATLAB源码-第140期】基于matlab的深度学习的两用户NOMA-OFDM系统信道估计仿真,对比LS,MMSE,ML。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 深度学习技术在无线通信领域的应用越来越广泛&#xff0c;特别是在非正交多址接入&#xff08;NOMA&#xff09;和正交频分复用&#xff08;OFDM&#xff09;系统中&#xff0c;深度学习技术被用来提高信道估计的性能和效率。…

MybatisPlus创建时间不想用默认值

我们知道&#xff0c;MybatisPlus可以给一些字段设置默认值&#xff0c;比如创建时间&#xff0c;更新时间&#xff0c;分为插入时设置&#xff0c;和更新时设置。 常见的例子&#xff1a; /*** 创建时间*/ JsonFormat(shape JsonFormat.Shape.STRING, pattern"yyyy-MM…

自养号测评低成本高效率推广,安全可控

测评的作用在于让用户更真实、清晰、快捷地了解产品以及产品的使用方法和体验。通过买家对产品的测评&#xff0c;也可以帮助厂商和卖家优化产品缺陷&#xff0c;提高用户的使用体验。这进而帮助他们获得更好的销量&#xff0c;并更深入地了解市场需求。因此&#xff0c;测评在…

区块链 之 默克尔树

默克尔树简介 欢迎阅读 BTC网络 之 区块裁剪 什么是默克尔树&#xff1f; 默克尔树&#xff08;Merkle Tree&#xff09;是一种树状数据结构&#xff0c;被广泛用于比特币等区块链系统中&#xff0c;用于高效地组织和验证数据的完整性。这个树状结构由唯一的根哈希值标识&am…

PostgreSQL按日期列创建分区表

在PostgreSQL中&#xff0c;实现自动创建分区表主要依赖于表的分区功能&#xff0c;这一功能从PostgreSQL 10开始引入。分区表可以帮助管理大量数据&#xff0c;通过分布数据到不同的分区来提高查询效率和数据维护的便捷性。以下是在PostgreSQL中自动创建分区表的一般步骤&…

Linux-目录I/O-004

学习重点&#xff1a; 1.目录I/O的函数接口 2.目录的遍历&#xff0c;目录的递归遍历 1.【mkdir】 1.1函数原型 【int mkdir(const char *pathname, mode_t mode);】1.2函数功能 创建目录文件1.3函数参数 1.3.1【pathname】 文件路径1.3.2【mode】 文件的权限1.4返回值 …

activeMq将mqtt发布订阅转成消息队列

1、activemq.xml置文件新增如下内容 2、mqttx测试发送&#xff1a; 主题&#xff08;配置的模糊匹配&#xff0c;为了并发&#xff09;&#xff1a;VirtualTopic/device/sendData/12312 3、mqtt接收的结果 4、程序处理 package comimport cn.hutool.core.date.DateUtil; imp…

Postgresql 怎么实现在局域网中访问

安装PostgreSQL后&#xff0c;默认情况下只能在本机进行连接访问&#xff0c;如果需要在其他主机上访问PostgreSQL数据库服务器&#xff0c;需要进行配置。 安装连接PostgresSQL数据库可以参考博文&#xff1a;安装连接PostgresSQL数据库教程 一. 整体步骤 主要包括下面几个步…

响应式建站系统源码:一站式建站平台 带完整的安装代码包以及搭建教程

在网络技术日新月异的今天&#xff0c;网站建设已经成为企业、个人展示自身形象、提供服务的重要窗口。然而&#xff0c;传统的网站建设方式往往需要投入大量的时间、金钱和人力成本&#xff0c;且对于非专业人士来说存在较高的技术门槛。为了解决这些问题&#xff0c;罗峰给大…