本文主要是介绍Linux Kernel 相关参数调优,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
内核共享内存默认参数与调优参数对比
------------------------------------------------------------------------------------------------------------------------------
默认参数:(kernel 3.10.0)
kernel.shmmax )== 18446744073692774399
kernel.shmmni = 4096
kernel.shmall = 18446744073692774399
kernel.sem = 250 32000 32 128
调优参数:
kernel.shmmax = 15461882265
kernel.shmmni = 4096
kernel.shmall = 3774873
kernel.sem = 250 32000 100 128 kernel.sem 信号量,sem其实是semaphores的缩写,信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。官方只建议调整 32 为 100。
kernel.shmmax 与 kernel.shmall 值是不能一样,二者单位都不一样,kernel.shmmax 单位是bytes, kernel.shmall单位是页 getconf PAGE_SIZE 4096 bytes,默认值太大而且不随着内存动态调整,kernel.shmmax一般根据具体系统具体内存调整,取值总内存的90%。
计算kernel.shmmax=(内存总数)16G*1024*1024*1024*90% = 15461882265
计算kernel.shmmax=(内存总数)32G*1024*1024*1024*90% = 30923764531
计算kernel.shmmax=(内存总数)96G*1024*1024*1024*90% = 92771293593
计算kernel.shmmax=(内存总数)128G*1024*1024*1024*90% = 123695058126
计算公式:kernel.shmall = kernel.shmmax / 4096 = 15461882265/4096 = 3774873
计算公式:kernel.shmall = kernel.shmmax / 4096 = 30923764531/4096 = 7549747
计算公式:kernel.shmall = kernel.shmmax / 4096 = 92771293593/4096 = 22649241
计算公式:kernel.shmall = kernel.shmmax / 4096 = 123695058125/4096 = 30198988
cat /proc/sys/kernel/sem 250 32000 32 128 (默认参数大多无需修改,除非ipcs -s 看出有信息量堆积或者messages 出现Data Engine A semaphore set has to be created but the system limit for the maximum number of semaphore sets has been exceeded 才调整 semopm 32 为 100) 官方推荐文档:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/5/html/tuning_and_optimizing_red_hat_enterprise_linux_for_oracle_9i_and_10g_databases/sect-oracle_9i_and_10g_tuning_guide-setting_semaphores-setting_semaphore_parameters
250 SEMMSL max semaphores per array #信号集容纳最大信号数量
32000 SEMMNS max semaphores system wide #所有信号的最大数量
32 SEMOPM max ops per semop call #调用单个信号集中最大信号数量
128 SEMMNI max number of arrays #信号集的最大值
共享内存拓扑:
共享内存允许两个或多个进程共享一个给定的存储区,这一段存储区可以被两个或两个以上的进程映射至自身的地址空间中,一个进程写入共享内存的信息,可以被其他使用这个共享内存的进程,通过一个简单的内存读取错做读出,从而实现了进程间的通信。
采用共享内存进行通信的一个主要好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝,对于像管道和消息队里等通信方式,则需要再内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次:一次从输入文件到共享内存区,另一次从共享内存到输出文件。(K8S pause 容器 就用ipcs 原理实现的)
基础云平台 > Linux Kernel 相关参数调优 > image2021-10-8 11:46:4.png
内核panic的条件,触发系统重启 默认参数与调优参数对比
------------------------------------------------------------------------------------------------------------------------------------------------------------------
默认参数 0表示不启动panic,因为启动panic可能触发系统重启
kernel.hung_task_panic=0 0 表示不启动panic, 示进程出现挂起时引发panic
kernel.hung_task_timeout_secs=120 进程hangtask机制超时时间
kernel.softlockup_panic=0 0 表示不启动panic, 软锁(soft lockup)触发panic
vm.panic_on_oom=0 0 表示不启动panic, 设置Kernel遇到OOM触发panic
kernel.panic_on_warn=0 0 表示不启动panic, 设置内核中出现警告产生panic
kernel.core_pattern = core 生成core文件,如果多个条件发生后,会被覆盖
kernel.panic = 0 0 表示系统触发panic不重启系统。
调优参数
kernel.hung_task_panic= 0
kernel.hung_task_timeout_secs=120
kernel.softlockup_panic=0
vm.panic_on_oom=0 值为0:内存不足时,启动 OOM killer。值为1:内存不足时,有可能会触发 kernel panic(系统重启),也有可能启动 OOM killer。值为2:内存不足时,表示强制触发 kernel panic,内核崩溃GG(系统重启)。
kernel.panic_on_warn=0
kernel.core_pattern = /tmp/core-%e-%p-%t 可以将core文件统一生成到/tmp目录下,产生的文件名为core-命令名-pid-时间戳 ,不会被覆盖。
kernel.panic = 0 0 表示系统触发panic 不重启系统,如果想定位问题,可以设置重启 一般设置 30 表示触发panic 30秒后重启系统。
当内核发生一些死锁,系统并不会重启,只会卡死。这种情况下并不会触发内核panic,需要配置条件促使内核panic,这样才能生成core文件,如果出现下面故障报错,为了判断问题,定位问题,可以把以上值设置成1,触发panic。
故障报错:“1,Kernel panic-not syncing fatal exception 2, kernel panic – not syncing: killing interrupt handler”
内核资源限制 默认参数与调优参数对比
------------------------------------------------------------------------------------------------------------------------------------------------------------------
默认参数
kernel.threads-max = 247744 每个进程中做多创建的的线程数目
kernel.pid_max = 32768 系统中最多分配的pid数量
vm.max_map_count = 65530 数量越大,能够创建的线程数目越多,限制一个进程可拥有的VMA(虚拟内存区域)
调优参数
kernel.threads-max = 4194304
kernel.pid_max = 655360 此值应该与ulimit -u max user processes 655360 相同 但是对于32位系统,该值只能扩展到理论最大值32768,对于64位,则可以扩展为4194304:(2^22) 最大值;
vm.max_map_count = 8388608
计算公式:kernel.threads-max = (内存总量)16G*1024*1024*1024/4096 = 4194304
kernel.threads-max = (内存总量)32G*1024*1024*1024/4096 = 8388608
kernel.threads-max = (内存总量)96G*1024*1024*1024/4096 = 25165824
kernel.threads-max = (内存总量)128G*1024*1024*1024/4096 = 33554432
计算公式:vm.max_map_count = kernel.threads-max * 2 = 4194304 * 2 = 8388608
vm.max_map_count = kernel.threads-max * 2 = 8388608 * 2 = 16777216
vm.max_map_count = kernel.threads-max * 2 = 25165824 * 2 = 50331648
vm.max_map_count = kernel.threads-max * 2 = 33554432 * 2 = 67108864
默认值就够用,除非出现不够用,按照以上公式计算给出值就可以。
softlockup_all_cpu_backtrace是一个开关,用来表示是否需要在一个cpu超时时打印所有cpu的backtrace信息,可以通过sysctrl进行控制,此处的用以是为了避免多个cpu再检测到死锁是同时调用
这篇关于Linux Kernel 相关参数调优的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!