内核里控制脏页的参数

Linux内存管理深入解析

内核的脏页的控制分为时空两个大的维度。

在时间上脏页不能存在时间过长,过长会导致内存紧张。同时如果时间过长,这时候突然掉电,那么会导致数据损失过多。所以,无论如何都要有个时间的限制。

在空间上脏页不能太多,太多也会导致内存紧张。

在时间控制上总要的参数有dirty_expire_centisecs,linux后台的flush线程按照dirty_writeback_centisecs周期启动,这个线程会查看这个参数,如果超过时间,就会写回。注意,系统即使还有很多剩余的内存。比如只有1页脏页,但是这个脏页的时间超过了dirty_expire_centisecs,那么这个脏页也会被写回。默认是30S,经验值一般调成8S。

基于空间的参数是,dirty_background_ratio和dirty_ratio。当脏页达到一定的比例,系统就要回收脏页了。当达到dirty_background_ratio门阈值后,后台进程开始写回脏页。当达到dirty_ratio之后,会阻塞正在分配内存的进程,然后调用写回脏页的进程,

脏页写回不是内存回收。脏页控制防止内存脏页过多。

 

内存回收涉及的是几个水位的变化。

在/proc/sys/vm/min_free_kbytes ,有个公式,计算是和低端内存大小和求低端内存平方根有关系

/*

 * Initialise min_free_kbytes.

 *

 * For small machines we want it small (128k min).  For large machines

 * we want it large (64MB max).  But it is not linear, because network

 * bandwidth does not increase linearly with machine size.  We use

 *

 *      min_free_kbytes = 4 * sqrt(lowmem_kbytes), for better accuracy:

 *      min_free_kbytes = sqrt(lowmem_kbytes * 16)

 *

 * which yields

 *

 * 16MB:        512k

 * 32MB:        724k

 * 64MB:        1024k

 * 128MB:       1448k

 * 256MB:       2048k

 * 512MB:       2896k

 * 1024MB:      4096k

 * 2048MB:      5792k

 * 4096MB:      8192k

 * 8192MB:      11584k

 * 16384MB:     16384k

 */

int __meminit init_per_zone_wmark_min(void)

{

        unsigned long lowmem_kbytes;

        int new_min_free_kbytes;

 

        lowmem_kbytes = nr_free_buffer_pages() * (PAGE_SIZE >> 10);

        new_min_free_kbytes = int_sqrt(lowmem_kbytes * 16);

 

        if (new_min_free_kbytes > user_min_free_kbytes) {

                min_free_kbytes = new_min_free_kbytes;

                if (min_free_kbytes < 128)

                        min_free_kbytes = 128;

                if (min_free_kbytes > 65536)

                        min_free_kbytes = 65536;

        } else {

                pr_warn("min_free_kbytes is not updated to %d because user defined value %d is preferred\n",

                                new_min_free_kbytes, user_min_free_kbytes);

        }

        setup_per_zone_wmarks();

        refresh_zone_stat_thresholds();

        setup_per_zone_lowmem_reserve();

 

#ifdef CONFIG_NUMA

        setup_min_unmapped_ratio();

        setup_min_slab_ratio();

#endif

 

        return 0;

}

core_initcall(init_per_zone_wmark_min)

Low=5/4*min

High=6/4*min

当达到low,后台回收(kswap)内存。直到high为止。但是应用的程序要内存的速度大于回收的速度,那么就有可能达到min水位,这个时候应用会阻塞,然后内核直接会回收内存。直到回收够用为止(需要看代码,多大是够用)。然后应用程序会再次运行。如果还不够,就直接kill一个占用内存比较大的进程,通常都是这个这个应用程序。

回收是匿名页多点还是文件背景的page cache多点。这个是由swappiness决定的。当swappiness比较大的话,swap匿名页就多,此时page cache被交换的比较小,这个场景适用于希望文件速度读写比较快。如果swappiness比较小的话,那么page cache交换的就比较多,适用于进程分配大内存且读写频繁。

 

综上,上面的参数搜没有最合适的值,需要根据场景做设置。

<think>好的,我现在要帮用户解决关于Linux内核参数调优的问题。首先,我需要理解用户的需求。他们想知道最佳实践,所以应该涵盖主要的调优方向和具体参数,同时给出操作建议。 用户提供的引用内容提到了内存管理、TCP调优、文件系统调优,以及调优的步骤。我需要把这些内容整合起来,确保结构清晰。可能分为几个部分,比如调优方向、常见参数、步骤和注意事项。 要注意引用对应的标记,比如[^1]、[^2]等,确保正确关联到参考内容。比如引用[1]提到默认参数可能不是最佳,需要根据环境调整,这可能放在调优步骤。引用[4]关于内存管理策略,应该在内存调优部分提及。 用户可能希望具体的例子,比如每个调优方向下的参数示例,如vm.swappiness、net.core.somaxconn等,并说明它们的作用和调整方法。同时,需要强调备份配置和监控的重要性,如引用[3]提到的。 还需要考虑用户的实际操作,比如如何修改参数,使用sysctl命令或编辑sysctl.conf文件。可能还要提到工具,如sysctl、/proc文件系统,以及监控工具如vmstat、sar,这部分引用[3]和[4]的内容。 要避免过于技术化的术语,但保持专业性。确保每个部分都有实际的应用场景,比如高并发下的网络调优,数据库服务器的内存优化,这样用户更容易理解。 最后,生成的相关问题需要围绕调优的不同方面,比如内存、网络、文件系统,以及调优步骤和工具。确保问题覆盖用户可能进一步询问的方向。 检查是否有遗漏的重要参数或步骤,确保引用正确,语法符合要求,数学表达式用$...$,如果有的话。不过这次内容可能较少涉及数学公式,但要注意LaTeX的正确使用,如果有的话。</think>### Linux内核参数调优最佳实践 Linux内核参数调优需结合具体应用场景,通过调整关键参数提升系统性能与稳定性。以下是主要调优方向及实践建议: --- #### 一、调优方向与核心参数 1. **内存管理调优** - **`vm.swappiness`**:控制内核使用交换分区的倾向,默认值60。对于数据库等内存敏感型应用,建议降低至10-30以减少交换频率[^4]。 - **`vm.overcommit_memory`**:控制内存分配策略。若应用需大量内存,可设为1(允许超量分配)或2(禁止超量分配)[^4]。 - **`vm.dirty_ratio`/`vm.dirty_background_ratio`**:调整刷盘阈值,避免I/O突发。例如: $$ \text{vm.dirty\_background\_ratio} = 5,\quad \text{vm.dirty\_ratio} = 10 $$ 2. **网络性能调优** - **`net.core.somaxconn`**:增大TCP连接队列长度(默认128),高并发场景可设为4096以上。 - **`net.ipv4.tcp_tw_reuse`**:启用TIME-WAIT套接字重用,减少端口耗尽问题。 - **`net.ipv4.tcp_max_syn_backlog`**:提高SYN队列容量,防御连接洪泛攻击。 3. **文件系统调优** - **`fs.file-max`**:增加系统最大文件句柄数,避免“Too many open files”错误[^3]。 - **`vm.vfs_cache_pressure`**:调整inode缓存回收优先级,默认值100,降低可提升文件访问性能[^3]。 --- #### 二、调优步骤与工具 1. **步骤** - **监控分析**:使用`vmstat`、`sar`、`dstat`等工具定位瓶颈。 - **参数备份**:修改前备份`/etc/sysctl.conf`或自定义配置文件。 - **渐进调整**:每次仅调整1-2个参数,观察性能变化[^3]。 2. **操作示例** ```bash # 临时修改参数 sysctl -w vm.swappiness=10 # 永久生效(编辑/etc/sysctl.conf) echo "vm.swappiness=10" >> /etc/sysctl.conf sysctl -p ``` --- #### 三、注意事项 - **硬件与负载适配**:例如高并发Web服务器需侧重网络参数,数据库服务器需优化内存与I/O[^5]。 - **内核版本差异**:部分参数在不同内核版本中行为可能变化,需验证兼容性。 - **监控验证**:调优后持续监控`/proc/meminfo`、`/proc/net/netstat`等指标。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值