当前位置: 首页 > news >正文

Linux性能调优,还可以从这些方面入手

        linux是目前最常用的操作系统,下面是一些常见的 Linux 系统调优技巧,在进行系统调优时,需要根据具体的系统负载和应用需求进行调整,并进行充分的测试和监控,以确保系统的稳定性和性能。同时,调优过程中要谨慎操作,避免对系统造成不良影响。

        其主要调优方向,大概包含几个方面:内存、CPU、i/o  网络调优以及安全性和资源限制。

一、内存调优

1、调整内核参数

        vm.swappiness:控制内核将内存页换出到交换空间的倾向。值越低,系统越倾向于保留内存中的页,减少对交换空间的使用。

        默认情况下,vm.swappiness设置为60,在服务器上,当内存使用率达到40%时就可能会使用交换空间。当你的服务器的RAM充足时,这个值可以适当降低,设置为10或更低,以减少不必要的交换操作。

        修改方法:编辑/etc/sysctl.conf文件,写入vm.swappiness=10

        运行命令sysctl -p使更改生效。

        vm.vfs_cache_pressure:调整内核回收用于目录和 inode 缓存的内存的倾向。较高的值会使内核更积极地回收缓存,释放内存用于其他用途。默认值为 100,可以根据系统负载和内存需求进行调整。

2、使用大页内存

        大页内存可以减少页表的大小,提高内存访问效率。对于内存密集型应用,如数据库,可以显著提高性能。
        启用大页内存需要在系统启动时进行配置,并在应用程序中进行相应的设置。

(1)在Linux系统中,可以通过下面的命令来查看系统是否支持大页内存。

cat /proc/meminfo | grep Hugepagesize

如果输出了大页的大小信息,则说明系统支持大页内存

(2)配置大页内存

临时配置:

sysctl -w vm.nr_hugepages=<number_of_hugepages>

其中 <number_of_hugepages> 是要分配的大页数量,例如大页大小设置为4096

永久配置:

在 /etc/sysctl.conf 文件中添加以下参数:

vm.nr_hugepages=<number_of_hugepages>

保存文件后,使其生效:

sysctl -p

二、CPU 调优

1、调整进程优先级

        使用 nice 和 renice 命令可以调整进程的优先级。较低的优先级数值表示更高的优先级。

        对于关键任务或对响应时间要求较高的进程,可以提高其优先级,确保它们获得更多的 CPU 时间。

        优先级的值范围是 -20 到 19,数值越小,优先级越高。默认情况下,进程以优先级 0 启动。

nice 基本语法:

nice [-n adjustment] command [arguments]

以优先级 5 启动一个名为 test 的程序:nice -n 5 test

renice  命令用于调整正在运行的进程的优先级。

基本语法:

renice priority [-p] pid... 或 renice priority [-g] pgrp... 或 renice priority [-u] user...
  • 其中,priority 是要设置的新优先级,pid 是进程 ID,pgrp 是进程组 ID,user 是用户名。
  • 例如,将进程 ID 为 1234 的进程优先级调整为 10:renice 10 -p 1234

注意:只有 root 用户可以将进程优先级设置为负值,以提高进程的优先级,普通用户只能减低进程的优先级或者保持不变。

2、绑定 CPU 核心

        通过 taskset 命令或在启动应用程序时指定 CPU 亲和性,可以将特定的进程绑定到特定的 CPU 核心上。

        这可以避免进程在不同的 CPU 核心之间频繁切换,提高 CPU 缓存的命中率,从而提高性能。

查询进程的CPU亲和性:

taskset -p <pid>

<pid> 是进程的ID 

设置进程的CPU亲和性:

taskset -cp <cpuset> <pid>

<cpuset> 是一个用逗号分隔的CPU核心列表, <pid> 是进程的ID

例如:将进程 ID 为 1234 的进程绑定到 CPU 核心 0 和 1 上运行:taskset -cp 0,1 1234

启动新进程时设置CPU亲和性:

taskset <cpuset> <command> [arguments]

<cpuset> 是一个用逗号分隔的 CPU 核心列表,<command> 是要执行的命令,<arguments> 是命令的参数。

例如,启动一个名为 test 的程序,并将其绑定到 CPU 核心 2 和 3 上运行:taskset 2,3 test

三、磁盘 I/O 调优

1、使用 SSD 硬盘

        SSD 硬盘具有更快的读写速度和更低的访问延迟,可以显著提高系统的磁盘 I/O 性能。

        如果可能,可以将关键数据和频繁访问的文件存储在 SSD 上。

对于SSD存储,通常推荐使用none或deadline调度器;对于HDD,则cfq或bfq可能更适合。
检查当前使用的调度器:

cat /sys/block/sda/queue/scheduler

更改调度器:

echo deadline > /sys/block/sda/queue/scheduler

禁用访问时间更新:
        在挂载选项中加入noatime以避免每次文件被读取时都更新访问时间戳,这样可以减少不必要的磁盘I/O。
        编辑/etc/fstab,修改相关分区条目,例如UUID=... / ext4 defaults,noatime 0 1

2、调整文件系统参数

        对于不同的文件系统,可以调整一些参数来优化磁盘 I/O 性能。例如,对于 ext4 文件系统,可以调整 block sizeinode size 等参数。

Ext 文件系统系列(如 Ext4)

  • 在创建文件系统时,可以使用特定的工具和选项来调整块大小和其他参数。例如,使用 mkfs.ext4 命令时,可以通过 -b 选项指定块大小,如 -b 4096 设置块大小为 4KB。
  • inode size 通常不是一个直接可配置的选项,但可以通过调整文件系统的总体布局和存储策略来间接影响 inode 的使用和分配。

XFS 文件系统

  • 使用 mkfs.xfs 命令创建文件系统时,可以通过 -b size= 选项设置块大小,例如 -b size=8192 设置块大小为 8KB。
  • inode 大小通常是根据文件系统的创建参数和存储需求自动调整的,一般情况下不太容易直接指定具体的 inode size。

3、使用磁盘缓存

        Linux 系统的磁盘缓存可以提高磁盘 I/O 的性能。可以通过调整内核参数 vm.dirty_background_ratio 和 vm.dirty_ratio 来控制磁盘缓存的行为。

        vm.dirty_background_ratio 表示当内存中的脏页达到系统内存的一定比例时,内核开始将脏页异步写入磁盘。

        vm.dirty_ratio 表示当内存中的脏页达到系统内存的更高比例时,内核将阻塞所有的写操作,直到脏页被写入磁盘。

临时调整:

sysctl vm.dirty_background_ratio=10
sysctl vm.dirty_ratio=20

永久调整:

  编辑  /etc/sysctl.conf  文件,添加下面设置:

vm.dirty_background_ratio = 10
vm.dirty_ratio = 20

保存文件后,使用 sudo sysctl -p 命令使更改生效。

四、网络调优

1、调整网络缓冲区大小

  • 可以通过调整内核参数 net.core.rmem_maxnet.core.wmem_maxnet.ipv4.tcp_rmem 和 net.ipv4.tcp_wmem 来调整网络接收和发送缓冲区的大小。
  • 较大的缓冲区可以提高网络吞吐量,但也可能会增加内存的使用。

net.core.rmem_max:
        定义了内核套接字接收缓冲区的最大大小。这个参数决定了系统在接收网络数据时可以使用的最大缓冲区空间。
net.core.wmem_max:
        定义了内核套接字发送缓冲区的最大大小。它控制了系统在发送网络数据时可以使用的最大缓冲区空间。
net.ipv4.tcp_rmem:
        这个参数是一个包含三个整数值的数组,用于设置 TCP 接收缓冲区的最小、默认和最大大小。例如,4096 87380 6291456表示最小接收缓冲区大小为 4096 字节,默认大小为 87380 字节,最大大小为 6291456 字节。
net.ipv4.tcp_wmem:
        与net.ipv4.tcp_rmem类似,也是一个包含三个整数值的数组,用于设置 TCP 发送缓冲区的最小、默认和最大大小。

临时调整:

sysctl -w net.core.rmem_max=<value>
sysctl -w net.core.wmem_max=<value>
sysctl -w net.ipv4.tcp_rmem=<min>,<default>,<max>
sysctl -w net.ipv4.tcp_wmem=<min>,<default>,<max>

永久调整:

编辑  /etc/sysctl.conf  文件,添加下面设置:

     net.core.rmem_max=<value>net.core.wmem_max=<value>net.ipv4.tcp_rmem=<min>,<default>,<max>net.ipv4.tcp_wmem=<min>,<default>,<max>

保存文件后,使用sudo sysctl -p命令使更改生效。

2、启用网络流量控制

        使用 tc(Traffic Control)工具可以对网络流量进行整形和控制。可以限制特定的网络接口或 IP 地址的带宽使用,确保关键服务的网络带宽得到保障。

3、优化网络协议栈

        对于特定的网络应用,可以调整网络协议栈的参数来提高性能。例如,对于 Web 服务器,可以调整 tcp_tw_reuse 和 tcp_tw_recycle 等参数来优化 TCP 连接的回收和重用。

tcp_tw_reuse:
        这个参数允许在 TIME_WAIT 状态的连接被重新用于新的连接。当设置为 1 时,内核会在安全的情况下(例如连接的时间戳符合要求等)将处于 TIME_WAIT 状态的连接重新分配给新的连接请求。
        启用这个参数可以减少 TIME_WAIT 状态的连接数量,从而节省系统资源,特别是在高并发的服务器环境中。
tcp_tw_recycle:
        这个参数开启快速回收 TIME_WAIT 状态的连接。当设置为 1 时,内核会更快地回收 TIME_WAIT 状态的连接,以减少连接资源的占用。
        但是,在一些网络环境中,开启这个参数可能会导致连接问题,特别是在网络地址转换(NAT)环境下,可能会导致数据包丢失和连接失败。

临时调整:

sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.tcp_tw_recycle=1

永久调整:

编辑  /etc/sysctl.conf  文件,添加下面设置:

net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=1

保存文件后,使用sudo sysctl -p命令使更改生效。

五、安全性和资源限制

        一般用在需要确保只有特定用户可以执行某些敏感操作,同时控制每个用户的资源消耗。

1、使用ulimit限制资源

        可以在用户的shell初始化脚本中设置ulimit指令,例如限制打开文件数、进程数等。

在 /etc/security/limits.conf 中定义全局或用户特定的资源限制。

临时调整:

ulimit -n 2048

永久调整:

编辑  /etc/security/limits.conf   文件添加设置:

/etc/security/limits.conf文件的每一行都包含四个字段,分别是:

  1. <domain>:指定限制的范围,可以是用户名、用户组名或通配符*表示全局范围。
  2. <type>:限制的类型,可以是soft(软限制)、hard(硬限制)或-(同时设置软限制和硬限制)。
  3. <item>:要限制的资源项,例如nofile(最大打开文件数)、nproc(最大进程数)等。
  4. <value>:资源限制的值。

例如:以下行表示将用户myuser的最大打开文件数软限制设置为 1024,硬限制设置为 2048:

myuser soft nofile 1024
myuser hard nofile 2048

保存文件后,通常需要用户重新登录才能生效。已经运行的进程,这些限制不会立即生效。

2、利用cgroups管理资源

cgroups(Control Groups)提供了一种机制来限制、记录和隔离进程组的资源使用情况。

创建cgroup目录结构并在其中设置相应的资源控制策略,如CPU份额、内存上限等。

创建cgroup目录:

        可以在 /sys/fs/cgroup/ 目录下创建。例如,创建一个名为  test 的 cgroup:

mkdir /sys/fs/cgroup/mygroup

设置资源控制策略:

        CPU份额控制:

                CPU 份额表示在多个 cgroup 之间分配 CPU 资源的比例。

                例如,设置CPU 份额为512 (相对权重):

echo 512 > /sys/fs/cgroup/mygroup/cpu.weight

        内存上限控制:

                设置内存上限可以限制cgroup中进程使用的内存总量:

                例如:设置内存上限为1GB :

echo 1073741824 > /sys/fs/cgroup/mygroup/memory.limit_in_bytes

将进程添加到cgroup 

        找到要添加到 cgroup 的进程 ID(PID)。可以使用命令如pstop来查找进程 ID。

将进程添加到cgroup

echo <pid> > /sys/fs/cgroup/mygroup/tasks

注意:在操作cgroups 时,可能需要使用管理员权限,确保你有足够的权限来创建和修改 cgroup 目录及设置资源控制策略。

相关文章:

Linux性能调优,还可以从这些方面入手

linux是目前最常用的操作系统&#xff0c;下面是一些常见的 Linux 系统调优技巧&#xff0c;在进行系统调优时&#xff0c;需要根据具体的系统负载和应用需求进行调整&#xff0c;并进行充分的测试和监控&#xff0c;以确保系统的稳定性和性能。同时&#xff0c;调优过程中要谨…...

STM32的独立看门狗定时器(IWDG)技术介绍

在嵌入式系统中&#xff0c;确保系统的稳定性和可靠性至关重要。看门狗定时器&#xff08;Watchdog Timer, WDT&#xff09; 是一种常用的硬件机制&#xff0c;用于监控系统的运行状态&#xff0c;防止系统因软件故障或意外情况进入不可预期的状态。STM32系列微控制器提供了两种…...

自动化生成工作流?英伟达提出ComfyGen:通过LLM来匹配给定的文本提示与合适的工作流程

ComfyGen的核心在于通过LLM来匹配给定的文本提示与合适的工作流程。该方法从500个来自用户的多样化提示生成图像&#xff0c;随后使用一系列美学预测模型对生成结果进行评分。这些评分与相应的工作流程形成了一个训练集&#xff0c;包含提示、工作流程及其得分的三元组。 然后…...

indicatorTree-v10练习(有问题)

目标&#xff1a;设计数据库表表格式&#xff0c;将“indicatorTree-v10.json”导入到数据库&#xff0c;再从数据库读取写为JSON文件。 其他要求&#xff1a;数据库要求为mysql数据库&#xff1b;编程语言暂时限定为C&#xff1b;JSON解析使用本文件夹中的cJSON.c和cJSON.h&am…...

python源码:指定麦克风/音响播放歌曲

前言 我使用pygame实现了指定麦克风/音响播放歌曲的功能&#xff0c;主要目的是解决直播过程的多源声道控制问题。 代码 # 查看自己的音频设备 # 请记住目标音频设备的具体名称 import pygame as mixer import pygame._sdl2 as sdl2mixer.init() # Initialize the mixer, thi…...

基于华为云智慧生活生态链设计的智能鱼缸

一. 引言 1.1 项目背景 随着智能家居技术的发展和人们对高品质生活的追求日益增长&#xff0c;智能鱼缸作为一种结合了科技与自然美的家居装饰品&#xff0c;正逐渐成为智能家居领域的新宠。本项目旨在设计一款基于华为云智慧生活生态链的智能鱼缸&#xff0c;它不仅能够提供…...

OJ-1015图像物体的边界

分析 思路 1.输入读取&#xff1a;读取网格的维度(M&#xff0c;N)和像素值到一个二维数组中。 2.迭代:遍历二维数组中的每个单元格。 3.边界检测:对于每个像素值为1的单元格,检查其八个相邻的单元格。如果任何相邻单元格的像素值为5,则增加边界计数。 4,边界计数调整:由于每…...

RAG 入门实践:从文档拆分到向量数据库与问答构建

本文将使用 Transformers 和 LangChain&#xff0c;选择在 Retrieval -> Chinese 中表现较好的编码模型进行演示&#xff0c;即 chuxin-llm/Chuxin-Embedding。 你还将了解 RecursiveCharacterTextSplitter 的递归工作原理。 一份值得关注的基准测试榜单&#xff1a;MTEB (M…...

445: 选择问题

解法&#xff1a; 第k大的数据查找 a, b map(int, input().split()) l list(map(int, input().split())) l.sort() print(l[b-1])...

IP地址类型选择指南:动态IP、静态IP还是数据中心IP?

你是否曾经困惑于如何选择最适合业务需求的IP地址类型&#xff1f;面对动态IP、静态IP和数据中心IP这三种选择&#xff0c;你是否了解它们各自对你的跨境在线业务可能产生的深远影响&#xff1f; 在跨境电商领域&#xff0c;选择合适的IP类型对于业务的成功至关重要。动态IP、…...

基于Python flask的豆瓣电影可视化系统,豆瓣电影爬虫系统

博主介绍&#xff1a;✌Java徐师兄、7年大厂程序员经历。全网粉丝13w、csdn博客专家、掘金/华为云等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不…...

面试不是一场遭遇战

引言 Ethan第一次跳槽时&#xff0c;把工作总结搞成简历&#xff0c;丢到BOSS&#xff0c;面了几场&#xff0c;结果都很糟。复盘下来&#xff0c;发现面试过程临场发挥太多&#xff0c;把攻坚战打成了遭遇战。 那面试要如何准备&#xff1f;什么情况下跳槽&#xff1f;有哪些大…...

【力扣 | SQL题 | 每日3题】力扣1795,1907,1398,602

1. 力扣1795&#xff1a;每个产品在不同商品的价格 1.1 题目&#xff1a; 表&#xff1a;Products ---------------------- | Column Name | Type | ---------------------- | product_id | int | | store1 | int | | store2 | int | | store3 …...

centos7.9升级rockylinux8.8

前言 查看centos的版本 &#xff0c;我这台服务器是虚拟机,下面都是模拟实验 升级前一定要把服务器上配置文件&#xff0c;数据等进行备份 [rootlocalhost ~]#cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [rootlocalhost ~]#uname -a Linux jenkins_ser…...

C++初阶(三)---C++入门(下)

目录 一、内联函数 1.内联函数的定义与底层机制 0x01.内联函数的定义 0x02.内联函数的底层机制 2.内联函数的优缺点 优点&#xff1a; 缺点&#xff1a; 3.内联函数的使用建议 4.内联函数的注意事项 二、auto关键字&#xff08;C11&#xff09; 1.代码示例 2.auto使…...

Linux--多路转接之epoll

上一篇:Linux–多路转接之select epoll epoll 是 Linux 下多路复用 I/O 接口 select/poll 的增强版本&#xff0c;它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统 CPU 利用率。它是 Linux 下多路复用 API 的一个选择&#xff0c;相比 select 和 poll&#xff0c…...

自动化工具Nico,从零开始干掉Appium,移动端自动化测试框架实现

这篇将用较短的篇幅给大家介绍我是如何实现iOS和Android的inspector&#xff08;元素审查工具&#xff09;的。 实现原理 为了更方便的显示UI界面&#xff0c;且更容易制作&#xff0c;我选择了使用web端来承载整个元素树展示。同时我选用Flask一次性梭哈前后端&#xff08;因…...

Fast CRC32

链接&#xff1a; Fast CRC32 Error Checking Real life data tends to get corrupted because machines (and humans) are never as reliable as we wish for. One efficient way is make sure your data wasnt unintendedly modifiied is to generate some kind of hash. T…...

生成一个带有二维数据和对应标签的螺旋形数据集(非线性可分数据集)的代码解析

def create_dataset():np.random.seed(1)m 400 # 数据量N int(m/2) # 每个标签的实例数D 2 # 数据维度X np.zeros((m,D)) # 数据矩阵Y np.zeros((m,1), dtypeuint8) # 标签维度a 4 for j in range(2):ix range(N*j,N*(j1))t np.linspace(j*3.12,(j1)*3.12,N) np.rando…...

PHP unset() 函数的作用

PHP 中的 unset() 函数用于销毁指定的变量。具体来说&#xff0c;它会解除变量名与其数据之间的关联&#xff0c;从而释放该变量所占用的内存。不过需要注意的是&#xff0c;unset() 并不是删除变量的内容&#xff0c;而是取消对变量名的引用。如果变量是数组中的某个元素或者对…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释

以Module Federation 插件详为例&#xff0c;Webpack.config.js它可能的配置和含义如下&#xff1a; 前言 Module Federation 的Webpack.config.js核心配置包括&#xff1a; name filename&#xff08;定义应用标识&#xff09; remotes&#xff08;引用远程模块&#xff0…...

FFmpeg avformat_open_input函数分析

函数内部的总体流程如下&#xff1a; avformat_open_input 精简后的代码如下&#xff1a; int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...

算法打卡第18天

从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7…...

FTXUI::Dom 模块

DOM 模块定义了分层的 FTXUI::Element 树&#xff0c;可用于构建复杂的终端界面&#xff0c;支持响应终端尺寸变化。 namespace ftxui {...// 定义文档 定义布局盒子 Element document vbox({// 设置文本 设置加粗 设置文本颜色text("The window") | bold | color(…...