Linux系统性能调优技巧详解
Linux系统性能调优技巧详解
Linux 系统广泛应用于服务器、嵌入式设备以及开发工作站中,因此对其进行性能调优是保障系统高效运行的关键之一。性能调优不仅可以提高系统的响应速度,还能有效优化资源使用,避免瓶颈。在这篇文章中,我们将深入探讨 Linux 系统性能调优的几种常见方法,并展示相应的代码和工具使用。

1. 性能调优前的准备
在开始调优之前,我们需要明确调优的目标。通常,Linux 系统的性能瓶颈来自于 CPU、内存、磁盘 I/O 和网络这四大部分。调优前,首先要进行性能监控和瓶颈分析。以下工具可以帮助我们了解系统当前的状态:
- top:实时查看 CPU、内存使用情况,监控进程。
- htop:
top的增强版,带有更友好的界面。 - vmstat:显示内存、I/O、CPU的统计信息。
- iostat:监控磁盘I/O性能。
- sar:收集和报告系统活动信息。
- netstat:查看网络连接和状态。
- perf:用于 CPU 性能分析的强大工具。
1.1 使用 top 监控 CPU 和内存
top 是 Linux 中最常用的性能监控工具之一,输入以下命令可以查看系统当前的 CPU 和内存使用情况:
top
top 输出的关键部分包括:
load average:显示系统负载,数值越大表示系统负载越高,通常系统负载应控制在CPU核数的范围内。%CPU:每个进程的 CPU 占用率。%MEM:每个进程的内存占用率。
1.2 使用 iostat 监控磁盘I/O
磁盘 I/O 是服务器性能瓶颈的常见来源之一。iostat 工具可以帮助你了解系统的 I/O 使用情况:
iostat -x 1 5
该命令会每秒更新一次磁盘 I/O 状态,运行 5 次。输出的关键指标有:
- %util:磁盘的使用率。如果此值接近 100%,说明磁盘可能成为瓶颈。
- await:每次 I/O 操作的平均等待时间,值越小越好。

2. CPU性能调优
2.1 优化 CPU 亲和性
CPU 亲和性指的是将特定进程绑定到特定的 CPU 核心上,以减少进程切换和缓存抖动。可以通过 taskset 命令来设置进程的 CPU 亲和性。
例如,将某个进程(PID 为 1234)绑定到第 1 和第 2 号 CPU 核上:
taskset -c 0,1 -p 1234
这样可以减少进程在多个 CPU 核之间切换带来的性能损失。
2.2 优化 CPU 调度策略
Linux 提供了几种不同的 CPU 调度策略,适用于不同类型的任务。常见的调度策略有:
- SCHED_OTHER:默认的调度策略,适用于大多数进程。
- SCHED_FIFO:适用于实时任务的调度策略,优先级高于普通任务。
- SCHED_RR:实时任务的另一种策略,基于时间片轮转调度。
可以通过 chrt 命令来修改进程的调度策略。例如,将某个进程的调度策略设置为 SCHED_RR 并指定优先级 10:
chrt -r -p 10 1234

3. 内存调优
3.1 调整虚拟内存(swappiness)
虚拟内存(swap)是 Linux 在内存不足时将部分数据写入磁盘的一种机制。然而,频繁使用 swap 会导致性能下降。因此,可以通过调整 swappiness 参数来控制系统使用虚拟内存的频率。
查看当前系统的 swappiness 值:
cat /proc/sys/vm/swappiness
默认情况下,该值通常为 60,表示当系统使用到 40% 的物理内存时就会开始使用 swap。可以通过修改这个值来减少对 swap 的依赖。例如,将 swappiness 设置为 10:
sudo sysctl vm.swappiness=10
这意味着系统在使用到 90% 内存之前不会使用 swap。
3.2 内存清理
在长时间运行的服务器上,内存中的缓存和无用的进程可能会占用大量内存。可以通过以下命令来释放内存中的缓存和无用数据:
sudo sync; sudo echo 3 > /proc/sys/vm/drop_caches
此操作不会影响运行中的进程,但会释放文件系统缓存。
3.3 使用 HugePages 优化内存性能
HugePages 是 Linux 提供的一种内存管理机制,可以有效减少 TLB(翻译后备缓冲区)的命中率,从而提高内存访问效率。配置 HugePages 的步骤如下:
- 查看当前系统的 HugePages 配置:
cat /proc/meminfo | grep HugePages
- 修改系统的 HugePages 配置(以 1024 页为例):
sudo sysctl -w vm.nr_hugepages=1024
- 将配置写入
/etc/sysctl.conf文件,以便在系统重启后生效:
echo "vm.nr_hugepages=1024" | sudo tee -a /etc/sysctl.conf

4. 磁盘I/O调优
4.1 调整 I/O 调度算法
Linux 提供了多种 I/O 调度算法,适用于不同的磁盘操作模式:
- cfq:完全公平队列,适合桌面系统。
- deadline:基于时间的调度算法,适合数据库系统。
- noop:简单的 FIFO 队列,适合 SSD。
查看当前磁盘的调度算法:
cat /sys/block/sda/queue/scheduler
修改磁盘调度算法为 deadline:
echo deadline | sudo tee /sys/block/sda/queue/scheduler
4.2 调整读写缓存策略
Linux 系统中的磁盘缓存机制能够显著提高磁盘读写性能。可以通过 hdparm 工具来调整磁盘的缓存策略:
sudo hdparm -W1 /dev/sda
此命令开启磁盘的写缓存,能够提升写操作的性能。
4.3 RAID 配置优化
如果你的系统使用 RAID 配置,可以通过调整 RAID 阵列的 stripe_cache_size 来提高 RAID 的性能:
sudo echo 32768 > /sys/block/md0/md/stripe_cache_size
这个命令将 RAID 阵列的缓存大小设置为 32768,能够显著提升 RAID 的写性能。

5. 网络性能调优
5.1 调整 TCP 缓存
为了优化网络性能,可以调整 Linux 系统的 TCP 缓存大小。默认情况下,系统的 TCP 缓存大小较小,可以通过以下命令进行调优:
sudo sysctl -w net.core.rmem_max=26214400
sudo sysctl -w net.core.wmem_max=26214400
sudo sysctl -w net.ipv4.tcp_rmem="10240 87380 12582912"
sudo sysctl -w net.ipv4.tcp_wmem="10240 87380 12582912"
这些命令调整了接收和发送的 TCP 缓存大小,可以提高高延迟、高带宽网络中的传输速度。
5.2 开启 TCP Fast Open
TCP Fast Open 是一种新的 TCP 协议扩展,允许客户端在连接握手时就开始发送数据,从而减少延迟。可以通过以下命令开启 TCP Fast Open:
sudo sysctl -w net.ipv4.tcp_fastopen=3
将这个配置写入 /etc/sysctl.conf 以在系统重启后保持设置:
echo "net.ipv4.tcp_fastopen=3" | sudo tee -a /etc/sysctl.conf

6. 使用 perf 进行性能分析
perf 是一个功能强大的 Linux 性能分析工具,它可以帮助你定位性能瓶颈。以下是一个简单的使用示例:
- 安装
perf:
sudo apt install linux-tools-common linux-tools-generic
- 使用
perf来记录 CPU 性能数据:
perf record -a -g
- 分析性能报告:
perf report
perf 会生成
一份详细的报告,显示哪些函数或进程占用了最多的 CPU 资源,从而帮助你进行进一步的优化。

7. 结论
Linux 系统性能调优是一项复杂的任务,需要根据具体的工作负载和系统环境进行有针对性的优化。本文介绍了从 CPU、内存、磁盘 I/O 和网络四个方面进行性能调优的方法,并提供了一些实用的工具和配置建议。在实际操作中,性能调优不仅仅是调整参数,还需要持续监控系统性能,以确保优化效果持续有效。通过合理的调优,Linux 系统可以在高负载下保持高效、稳定的运行。

相关文章:
Linux系统性能调优技巧详解
Linux系统性能调优技巧详解 Linux 系统广泛应用于服务器、嵌入式设备以及开发工作站中,因此对其进行性能调优是保障系统高效运行的关键之一。性能调优不仅可以提高系统的响应速度,还能有效优化资源使用,避免瓶颈。在这篇文章中,我…...
MFC工控项目实例之十九手动测试界面输出信号切换
承接专栏《MFC工控项目实例之十八手动测试界面输入信号实时检测》 根据板卡设置界面组合框选项设定的输出信号,通过读取文件中保存的键值,用单选按钮切换输出信号接通、关闭。 1、在Data_1.h文件中添加代码 CString COMB_Data_O_1[]{"夹紧",&…...
数据结构——栈的基本操作
前言 介绍 🍃数据结构专区:数据结构 参考 该部分知识参考于《数据结构(C语言版 第2版)》55 ~ 59页 🌈每一个清晨,都是世界对你说的最温柔的早安:ૢ(≧▽≦)و✨ 1、栈的基本概念 栈&#x…...
Chainlit集成LlamaIndex实现知识库高级检索(组合对象检索)
检索原理 对象组合索引的原理 是利用IndexNode索引节点,将两个不同类型的检索器作为节点对象,使用 SummaryIndex (它可以用来构建一个包含多个索引节点的索引结构。这种索引通常用于从多个不同的数据源或索引方法中汇总信息,并能…...
万界星空科技铜拉丝行业MES系统,实现智能化转型
一、铜拉丝行业生产管理的难点主要体现在以下几个方面: 1、标准严格:铜线产品对质量的要求极高,特别是在电气性能、导电性、耐腐蚀性等方面,任何微小的瑕疵都可能影响产品的使用效果和安全性。 2、过程监控:生产过程…...
ECCV 2024 现场:参会者付高价、跨万里,却无法入场?
ECCV(European Conference on Computer Vision,欧洲计算机视觉国际会议)是计算机视觉领域的重要国际会议之一,与CVPR和ICCV并称为计算机视觉的三大顶级会议。 ECCV2024是该系列会议的第18届会议,2024年9月29日至10月4…...
使用rsync+jenkins实现服务自动部署全流程
项目背景:城市政务云服务器没有上k8s,所有后端服务都是原始方式部署启动 (java -jar xxx.jar),那么有没有方式简化部署难度,实现自动部署?当然是有的,下面详细介绍(以Cen…...
python 实现decision tree决策树算法
decision tree决策树算法介绍 决策树算法(Decision Tree Algorithm)是一种基于输入特征对实例进行分类的树结构模型,主要用于分类和回归任务。其基本原理是根据训练数据的特征属性和类别标签之间的关系,生成一个能够对新样本进行…...
前端大模型入门:实战篇之Vue3+Antdv+transformers+本地模型实现增强搜索
本文将之前的文章,实现一个场景的实战应用,包含代码等内容。利用纯前端实现增强的列表搜索,抛弃字符串匹配,目标是使用番茄关键字可以搜索到西红柿 1 准备工作 1.1 了解llm和web开发 web端的ai开发参考 前端大模型入门ÿ…...
《向量数据库指南》——Fivetran 的 Partner SDK:构建自定义连接器和目标
哈哈,说到 Fivetran 的 Partner SDK,这可真是个好东西啊!作为向量数据库领域的“老司机”,我今天就来给大家详细讲讲这个 SDK 的厉害之处,以及如何用它来构建自定义连接器和目标,实现与 Fivetran 自动化数据移动平台的无缝集成。 一、Fivetran Partner SDK:开启自定义连…...
微信小程序的 button 标签的边框如何去除?
目录 问题描述: 问题原因: 解决办法: 方案一 方案二 问题描述: 实际开发中会发现这个 button 自带有样式,当背景颜色设置为白色的时候还有一个黑色的边框,刚开始那个边框怎么都去不掉 无法去除的边框…...
20240926 关于Goland处理wsl-GOROOT原理猜测
GOROOT的原理 go sdk与java jdk类似,是go的编译工具链的集合。 在windows上,我们通过在系统环境变量中添加GOROOT并设置为go sdk地址,使得命令行可以访问到go sdk并执行go test、build等命令,这样设置的变量是全局生效的&#x…...
Anki 学习日记 - 卡片模版 - 单选ABCD(纯操作)
摘要:在不懂前端语言的情况下自定义卡片模版,卡片模版的字段 安装(官网):Anki - powerful, intelligent flashcards (ankiweb.net) 一、在哪能修改卡片模版 管理笔记模板 - > 添加 -> 问答题 -> 设置名称 二…...
钉钉x昇腾:用AI一体机撬动企业数字资产智能化
“走红”近两年后,大模型正在加速走进千行万业。 由于大模型的主要模态是文字和图片,恰好是数字化办公最基础的内容要素,办公于是成了离AI最近的场景。 公文写作、表格生成、提炼大纲、文本翻译、代码润色、数据统计、智能问答……越来越多…...
【C/C++】 秋招常考面试题最全总结(让你有一种相见恨晚的感觉)
目录 1.C程序编译链接过程 2.浅拷贝和move有区别吗 3.深拷贝和浅拷贝的区别 4.空类的大小 5.类的继承有几种方式,区别是什么? 六、extern 关键字的作用 七、static关键字的作用 八、指针和引用的区别 九、C内存分配方式 十、结构体对齐…...
CSS面试真题 part1
CSS面试真题 part1 1、说说你对盒子模型的理解2、谈谈你对BFC的理解3、什么是响应式设计?响应式设计的基本原理是什么?如何做?4、元素水平垂直居中的方法有哪些?如果元素不定宽高呢?5、如何实现两栏布局,右…...
针对考研的C语言学习(定制化快速掌握重点5)
顺序表 特点: 写代码主要就是增删改查!!! 写代码的边界性非常重要以及考研插入和删除的位置都是从1开始,而数组下标是从0开始 【注】下标和位置的关系 线性表最重要的是插入和删除会涉及边界问题以及判断是否合法 …...
构建高效房屋租赁系统:Spring Boot应用
1 绪论 1.1 研究背景 中国的科技的不断进步,计算机发展也慢慢的越来越成熟,人们对计算机也是越来越更加的依赖,科研、教育慢慢用于计算机进行管理。从第一台计算机的产生,到现在计算机已经发展到我们无法想象。给我们的生活改变很…...
学习单片机编程和硬件设计步骤
学习单片机编程和硬件设计可以分为几个步骤: 理解基本概念:首先需要了解单片机的基本概念、硬件结构和工作原理 。 选择开发平台:选择一个合适的单片机系列作为起点,如Arduino、ESP8266/ESP32或STM32系列 。 准备工具和环境&…...
.net Framework 4.6 WebAPI 使用Hangfire
C# 使用 Hangfire 第一章 .net Framework 4.6 WebAPI 使用Hangfire 文章目录 C# 使用 Hangfire前言一、hangfire是什么?二、hangfire的特点三、.net Framework 中hangfire的使用方法第一步:创建WebAPI控制器第二步:添加nuget包第三步 创建startup类新建项目startup类Startu…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
