linux知识点-内核参数相关

待整理,占位

查看和修改

查看当前内核参数:

bash 复制代码
sysctl -a查看所有的内核参数和数值
sysctl -n kernel.randomize_va_space 查看randomize_va_space的值
sysctl -n fs.file-max 查看file-max的值
cat  /proc/sys/kernel/randomize_va_space 查看randomize_va_space的值
cat  /proc/sys/fs/file-max 查看file-max的值
sysctl kernel.randomize_va_space 查看randomize_va_space的值
sysctl fs.file-max 查看file-max的值
sysctl kernel 查看kernel下的所有内核参数
sysctl fs 查看fs下的所有内核参数

修改内核参数

bash 复制代码
# 以修改randomize_va_space内核参数为例,三种方式:
Disable ASLR temporarily (change is only effective until next boot):
Run "sysctl -w kernel.randomize_va_space=0" as root.

Temporarily disable ASLR(change is only effective until next boot):
echo 0 > /proc/sys/kernel/randomize_va_space

Disable ASLR immediately and on all subsequent reboots:
Add the following line to /etc/sysctl.conf:
kernel.randomize_va_space=0
and then run "sysctl -p" as root to make the change take effect immediately.

sysctl --system 和sysctl -p的区别

sysctl -p 默认(不指定文件情况下)加载 /etc/sysctl.conf 中所有的参数。

sysctl --system 不指定文件情况默认加载from all system configuration files,如下

/run/sysctl.d/.conf
/etc/sysctl.d/
.conf

/usr/local/lib/sysctl.d/.conf
/usr/lib/sysctl.d/
.conf

/lib/sysctl.d/*.conf

/etc/sysctl.conf

数据库相关的内核参数

因为数据库的专业性,为了配合其使用,调整的内核参数最多,所以此章节介绍oracle数据库相关内核参数。

ipcs -l 查看相关的内核参数设置

ipcs -u 可以看到实际使用的情况

对应的共享内存m 信号量s 消息队列q - a内存信号量队列都看

bash 复制代码
------ Shared Memory Limits --------共享内存
      max number of segments = 4096               // kernel.shmmni    
      max seg size (kbytes) = 32768               // kernel.shmmax
      max total shared memory (kbytes) = 8388608  // kernel.shmall
      min seg size (bytes) = 1

      ------ Semaphore Limits --------
      max number of arrays = 1024                 // SEMMNI
      max semaphores per array = 250              // SEMMSL
      max semaphores system wide = 256000         // SEMMNS
      max ops per semop call = 32                 // SEMOPM
      semaphore max value = 32767

      ------ Messages: Limits --------
      max queues system wide = 1024               // MSGMNI
      max size of message (bytes) = 65536         // MSGMAX
      default max size of queue (bytes) = 65536    // MSGMNB

共享内存

kernel.shmmni :

这个内核参数用于设置系统范围内共享内存段的最大个数。该参数的默认值是 4096 。这一数值已经足够,通常不需要更改(注意该参数不是shmmin,是shmmni(没有n),shmmin 表示内存段最小大小 ) 。

kernel.shmmax

单个进程能使用的共享内存段的最大尺寸(Bytes), 一般根据物理内存修改,尽量让整个SGA在共享内存段中 。 Shmmax 是最重要的参数之一,过低会导致需要多个共享内存段,导致轻微性能下降 ,Oralce建议共享内存段能容纳整个SGA,shmmax 设置为大于SGA_MAX_SIZE 。一般为物理内存90%。

kernel.shmall

系统一次可以使用的共享内存总量(以页为单位,ipcs -l看到的是以字节为单位)。简言之,该参数的值始终应该至少为: ceil(SHMMAX/PAGE_SIZE)

注意:Red Hat的 页大小 为 4096 字节。但可以使用 bigpages ,它支持配置更大的内存页面尺寸,一般设置物理内存90%

信号量

kernel.SEMMSL

每个信号量set 中 信号量最大个数 设置:最小250;对于processes参数设置较大的系统建议设置为processes+10 The maximum semaphores per semaphore set

kernel.SEMMNS

linux系统中信号量最大个数 设置:至少32000;SEMMSL * SEMMNI A system-wide limit on the number of semaphores in all semaphore sets

kernel.SEMOPM

系统调用允许的信号量最大个数设置:至少100;或者等于SEMMSL The maximum number of operations that may be specified in a semop(2) call.

SEMOPM在ORACLE中主要限制体现在:

1.lgwr写完之后通知应用进程的过程中,也就是主要影响log file sync(如设置250,一次semops最多可以通知250个应用进程,当应用commit厉害时,semops会大大增加,会到影响系统性能)。

2.发生大规模enqueue lock时,通知等待在此锁资源上的进程(如果有500个进程等待同一个锁,则需要进行2次semops调用,来通知等待的进程,锁可以使用了)。

补充:SEMOPM是一个系统调用,类似的还有semtimedop调用。

可以跟踪一下oracle的lgwr进程,可以看到秒隔3秒调用一次semtimedop,是一个超时调用,当semtimedop()调用致使lgwr进程进入睡眠,因为logbuffer在空闲的情况下有一个3秒刷一次的机制:

bash 复制代码
[oracle@fd_perf4 ~]$ ps -ef|grep lgwr
oracle   15341  1934  0 19:49 pts/0    00:00:00 grep lgwr
oracle   15445     1  0  2010 ?        00:14:06 ora_lgwr_fd_perf4

[oracle@fd_perf4 ~]$ strace -p 15445
Process 15445 attached -- interrupt to quit
times(NULL)                             = 2742619382
semtimedop(98304, 0x7fbfffde70, 1, {1, 420000000}) = -1 EAGAIN (Resource temporarily unavailable)
times(NULL)                             = 2742619524
times(NULL)                             = 2742619524
times(NULL)                             = 2742619524

kernel.SEMMNI

linux系统信号量set最大个数 设置:最少128 A system-wide limit on the maximum number of semaphore identifiers.

所以,SEMMNI*SEMMSL=SEMMNS

db2中SEMMNI是系统上所需最大代理程序数乘以数据库服务器计算机上的逻辑分区数加上数据库服务器计算机上本地应用程序连接数的两倍。

内核参数 kernel.sem 4 个标记(SEMMSL、SEMMNS、SEMOPM 和 SEMMNI)例子

bash 复制代码
cat /proc/sys/kernel/sem
250     32000   100     128

oracle中信号量相关设置

oracle 中PROCESSES参数设置较大时,需要调整SEMAPHORES设置,SEMMSL应该设置为服务器中各个实例中最大的PROCESSES参数+10,例PROCESSES参数为5000时,SEMMSL应设置为5010。

SEMMNS参数应设置为SEMMSLSEMMNI,接上例SEMMSL为5010,SEMMNS参数应为(5010 128)=641280。

SEMOPM参数应设置与SEMMSL参数相同,接上例此处应设置为5010

消息队列

db2中消息队列相关设置

db2中 MSGMNI 影响可启动的代理程序数,是系统内消息队列的最大个数

MSGMAX 每个消息最大的字节数,

MSGMNB 队列的大小。

MSGMAX 应更改为 64 KB(即,65535 字节),MSGMNB 应该增加至 65535。

其他oracle常见需要配置的内核参数

net.ipv4.ip_local_port_range 表示应用程序可使用的IPv4端口范围。oracle建议9000 65500

net.core.rmem_default 表示套接字接收缓冲区大小的缺省值。oracle建议262144

net.core.rmem_max 表示套接字接收缓冲区大小的最大值。oracle建议4194304

net.core.wmem_default 表示套接字发送缓冲区大小的缺省值。oracle建议262144

net.core.wmem_max 表示套接字发送缓冲区大小的最大值。oracle建议1048586

swappiness

内存足够时,没必要使用swap 。可能通过swappiness改变使用swap的优先级。swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。其默认值是60

echo 10 > /proc/sys/vm/swappiness 或者 echo "vm.swappiness=10″ >> /etc/sysctl.conf

sysctl -p

其他DB2需要配置的参数

vm.swappiness db2建议0 设置 vm.swappiness=0 配置内核优先将应用程序保留在 RAM 中,而不是为文件高速缓存分配更多内存。

vm.overcommit_memory db2建议0 此参数影响内核允许分配的虚拟内存量。缺省设置 vm.overcommit_memory=0 将内核设置为不允许单个进程进行过大的内存分配,但分配的总虚拟内存不受限制。

kernel.randomize_va_space db2建议0 此参数配置内核使用内存地址空间布局随机化

fs.file-max

OS中所有进程可以打开的文件描述符总数量 。如果得到大量使用完文件句柄的错误信息,是应该增加这个值。

文件描述符

  • 文件描述符是操作系统用于管理打开文件的抽象标识符
  • 每个进程打开文件、网络套接字、管道等都会消耗文件描述符
  • 不仅是普通文件,还包括网络连接、设备文件等

查看当前值

bash 复制代码
# 查看当前系统限制
cat /proc/sys/fs/file-max

# 查看当前已使用的文件描述符数量
cat /proc/sys/fs/file-nr
# 输出三个数字:已分配、未使用但已分配、最大值

修改

bash 复制代码
临时生效
# 立即生效
sudo sysctl -w fs.file-max=1000000
# 或直接写入
echo 1000000 | sudo tee /proc/sys/fs/file-max

永久生效
view /etc/sysctl.conf
# 添加或修改以下行
fs.file-max = 1000000
# 使配置生效
sudo sysctl -p

用户级限制

  • ulimit -n:控制单个用户/进程的文件描述符限制
  • 修改方法:ulimit -n 65535 或编辑 /etc/security/limits.conf

进程级别的限制 /proc/[PID]/limits:查看特定进程的限制,每个进程的实际限制受用户级和系统级限制的共同约束

相关推荐
w_t_y_y6 小时前
Nginx Plus
运维·数据库·nginx
Galloping-Vijay7 小时前
Claude Code 使用笔记
笔记
CAFEBABE 347 小时前
linux离线安装docker并启动
linux·docker·eureka
曼巴UE58 小时前
UE FString, FName ,FText 三者转换,再次学习,官方文档理解
服务器·前端·javascript
wanhengidc8 小时前
云手机的存储空间可以灵活扩展吗?
运维·服务器·科技·智能手机·云计算
Danileaf_Guo8 小时前
256台H100服务器的RoCEv2无损与全互联算力网络建设方案
运维·服务器·网络
解压专家6669 小时前
怎么找书?怎么传输?在Kred里完成的全过程
运维·服务器·网络
极市平台9 小时前
骁龙大赛-技术分享第5期(上)
人工智能·经验分享·笔记·后端·个人开发
OnlyEasyCode9 小时前
快速上手!查看、拷贝、编辑、远程连接Linux命令
linux·运维·服务器