正文
内核参数作用域的情况
1. 全系统生效
2. 进程生效
3. 用户生效
4. 协同作用.
# 本文并不会按照范围进行单独阐述
# 会按照一个作用链条进行说明.
nofile
number of file
本质是一个进程能够打开文件数的限制.
是操作系统避免单个线程文件数打开过多,导致系统资源耗尽的一个保护机制.
第一层是全局发生作用的一些参数
fs.file-max = 3265659
该参数是整个系统能够打开的file handler 的总量. 所有的进程打开文件数总和不能超过这个数.
需要注意, 这个是针对整个系统的限制.
fs.nr_open = 1048576
该参数是决定单个进程最大的打开文件数.
需要注意 这个是针对单一进程的限制.
fs.file-nr = 9792 0 3265659
这个是一个状态指示的文件,一共三个值,
第一个代表全局已经分配的文件描述符数量,
第二个代表自由的文件描述符(待重新分配的),
第三个代表总的文件描述符的数量。
需要注意, 这几个参数的默认是是不一样的. 云服务器的一般是300万多.
自己搭建的centos 是 680万
但是国产操作系统的默认值是: 9223372036854775807
位数太多, 请自己数 !-_-!
有了如上三个参数之后 就是 Linux系统里面的 /etc/security/limits.conf
一般可以在文件的最后增加:
* soft nofile 65535
* hard nofile 65535
需要注意, 这个参数是针对某些用户单个线程打开的文件数限制.
作用域最小. 但是用到的最多.
网络参数
网络参数已经多次讲述, 这里主要是想描述一下几个参数的作用域
# 全系统生效的参数:
net.ipv4.tcp_syncookies = 1
net.ipv4.ip_forward = 0 # 如果是docker后者是KMV必须打开
net.ipv4.tcp_rmem = 4096 87380 8388608
net.ipv4.tcp_wmem = 4096 87380 8388608
net.core.rmem_max = 8388608
net.core.wmem_max = 8388608
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_tw_buckets = 5000
# 针对具体进程生效的全局参数
net.core.netdev_max_backlog = 5000
net.ipv4.ip_local_port_range = 2000 65000
net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 4096
网络参数
着重说明几个参数
1. backlog
backlog 是绝对单个进程TCP全连接大小的一个绝对因素.
都是配置全局生效,但是作用域是针对单个进程/线程来区分的.
2. net.ipv4.ip_local_port_range
的参数也类似. 是全局生效,但是一组相同的对端 TCP四元组来进行限制.
比如 我nginx可以使用portreuse的方式实现多个进程进行绑定 同一个端口号
但是port_range是针对TCP的四元组来进行限制,不是根据多个worker进程来进行成绩限制
他限制的是TCP级别的总量,而不是进程级别
3. net.ipv4.tcp_max_tw_buckets
这个参数是一个总计参数.
是所有的进程time_wait的总计个数. 不区分进程进行统计
作用域是整个系统.
所有的TCP连接的time_wait总量是这个数据.
4. 关于文件参数和网络参数.
文件的TCP建立数量绝对不可能大于nofile的数量
unix 里面一切皆文件.
C100K理论 至少两个进程 并且nofile 也要接近或者是超过100k个有可能实现.
大页内存的优势
1. 大页内会不会因为内存压力导致被swap到磁盘空间.
这会保证内存一直在物理内存中,性能最好.
2. 大页内存占用的页表项比较少,相同大小的TLB可以管理更大空间的内容
OS或者是Oracle在寻址时TLB被刷新的概率会减少.
能够极大的提高系统的性能, 避免出现性能衰退.
大页内存
Oracle数据库为了提高性能, 在大内存的情况下 要求启用大页内存
# 需要注意, Oracle要求关闭 红帽开发的透明大页.
主要涉及的参数有:
第一步查看大页内存的大小
cat /proc/meminfo | grep Huge
Hugepagesize: 2048 kB
Hugepagesize: 524288 kB # 华为云鲲鹏虚拟机.
# 注意这个参数一般的系统默认值是 2MB, 但是华为云鲲鹏默认值是 512MB
支持的大页内存大小可以通过如下目录进行查看:
ls /sys/kernel/mm/hugepages/
ARM机器的结果为:
hugepages-2048kB hugepages-524288kB
x86机器的结果为:
hugepages-1048576kB hugepages-2048kB
# 理论上可以修改. 内存页面的默认大小都是4KB. 不过部分ARM服务器是 64KB
getconf PAGE_SIZE
部分ARM机器的为:
65536
x86机器的为:
4096
大页内存
第二步 设置大页数量
编辑配置文件: sysctl.conf
增加一行
vm.nr_hugepages = 10240
在2MB大页的情况下, 会创建20G的大页空间.
sysctl -p 可以使之生效.
另外还有一些参数:
shmall 是全部允许使用的共享内存大小,
shmmax 是单个段允许使用的大小。这两个可以设置为内存的 90%。
例如 16G 内存:
shmmax 的大小为 16*1024*1024*1024*90% = 15461882265,
shmall 的大小为 15461882265/4k(getconf PAGESIZE可得到) = 3774873。
增加memlock的限制
* hard memlock unlimited
* soft memlock unlimited
大页内存的其他设置
1. Oracle更改SGA或者是memory_target的数值
注意这个数值不能的大于 getconf PAGESIZE * vm.nr_hugepages
建议要稍微小一些.
也不能大于shmmax
2. JVM启动服务时的设置.
增加配置节: -XX:+UseLargePages -XX:LargePageSizeInBytes=2m
一般只有大于32G的堆区设置大页内存才会有提升. 较小的堆区意义不大.
建议与Oracle一样, 不要大于系统的设置值.
因为大页内容相当于申请出来,一程序不会进行使用的.