内核参数设置
Linux 操作系统修改内核参数有以下三种方式:
修改 /etc/sysctl.conf 文件;
在文件中加入配置项,格式为 key = value,保存修改后的文件,执行命令 sysctl -p 加载新配置。
使用 sysctl 命令临时修改;
如:sysctl -w net.ipv4.tcp_mem = “379008 505344 758016”直接修改 /proc/sys/ 目录中的文件。
如:echo “379008 505344 758016” 》 /proc/sys/net/ipv4/tcp_mem注意:第一种方式在重启操作系统后自动永久生效;第二种和第三种方式在重启后失效。
内核参数
kernel.core_uses_pid = 1
core_uses_pid 可以控制 core 文件的文件名中是否添加 pid 作为扩展名。设置为1,表示添加 pid 作为扩展名,生成的 core 文件格式为 core.xxx;设置为0(默认),表示生成的 core 文件统一命名为 core。
kernel.core_pattern = core
core_pattern 可以控制 core 文件的保存位置和文件格式。
如:kernel.core_pattern = “/corefile/core-%e-%p-%t”,表示将 core 文件统一生成到 /corefile 目录下,产生的文件名为 core-命令名-pid-时间戳。
以下是参数列表:
%p – insert pid into filename 添加 pid
%u – insert current uid into filename 添加当前 uid
%g – insert current gid into filename 添加当前 gid
%s – insert signal that caused the coredump into the filename 添加导致产生 core 的信号
%t – insert UNIX time that the coredump occurred into filename 添加 core 文件生成时的 unix 时间
%h – insert hostname where the coredump happened into filename 添加主机名
%e – insert coredumping executable name into filename 添加命令名
kernel.msgmax = 8192
进程间的消息传递是在内核的内存中进行的。msgmax 指定了消息队列中消息的最大值。(65536B=64KB)
kernel.msgmnb = 16384
msgmnb 规定了一个消息队列的最大值,即一个消息队列的容量。msgmnb 控制可以使用的共享内存的总页数。Linux共享内存页大小为4KB,共享内存段的大小都是共享内存页大小的整数倍。一个共享内存段的最大大小是 16G,那么需要共享内存页数是16GB / 4KB = 16777216KB / 4KB = 4194304(页),也就是64Bit系统下16GB物理内存,设置kernel.shmall = 4194304才符合要求。
kernel.shmall = 1048576
表示在任何给定时刻,系统上可以使用的共享内存的总量(bytes)。
kernel.shmmax = 4294967295
表示内核所允许的最大共享内存段的大小(bytes)。用于定义单个共享内存段的最大值,64位 linux 系统,可取的最大值为物理内存值 – 1byte,建议值为多于物理内存的一半,一般取值大于SGA_MAX_SIZE即可,可以取物理内存-1byte。例如,如果为64GB物理内存,可取64 * 1024 * 1024 * 1024 – 1 = 68719476735。
实际可用最大共享内存段大小=shmmax * 98%,其中大约2%用于共享内存结构。可以通过设置 shmmax,然后执行ipcs -l来验证。
kernel.sysrq = 0
控制系统调试内核的功能,不同的值对应不同的功能:
0 完全禁用 sysrq 组合键
1 启用 sysrq 组合键的全部功能
2 启用控制台日志级别控制
4 启用键盘控制(SAK、unraw)
8 启用进程的调试信息输出等
16 启用同步命令
32 启用重新挂载为只读
64 启用进程信号(终止、杀死、溢出杀死)
128 允许重启/关机
256 控制实时任务的优先级控制(nicing)
net.core.netdev_max_backlog = 262144
表示当每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包的最大数目。
net.core.rmem_default = 8388608
为 TCP socket 预留用于接收缓冲的内存默认值。
net.core.rmem_max = 16777216
为 TCP socket 预留用于接收缓冲的内存最大值。
net.core.somaxconn = 128
listen(函数)的默认参数,挂起请求的最大数量限制。web 应用中 listen 函数的 backlog 默认会给我们内核参数的 net.core.somaxconn 限制到128。nginx 服务器中定义的 NGX_LISTEN_BACKLOG 默认为511。
net.core.wmem_default = 8388608
为 TCP socket 预留用于发送缓冲的内存默认值。
net.core.wmem_max= 16777216
为 TCP socket 预留用于发送缓冲的内存最大值。
net.ipv4.conf.all.accept_source_route = 0、net.ipv4.conf.default.accept_source_route = 0
处理无源路由的包。
net.ipv4.conf.all.rp_filter = 1、net.ipv4.conf.default.rp_filter = 1
开启反向路径过滤。
net.ipv4.ip_forward = 0、net.ipv4.conf.all.send_redirects = 0、v4.conf.default.send_redirects = 0
不充当路由器。
net.ipv4.icmp_echo_ignore_broadcasts = 1
避免放大攻击。
net.ipv4.icmp_ignore_bogus_error_responses = 1
开启恶意 ICMP 错误消息保护。
net.ipv4.ip_local_port_range = 1024 65535
增加系统 IP 端口限制。表示用于向外连接的端口范围。参考
net.ipv4.tcp_fin_TImeout = 30
如果套接字由本端要求关闭,这个参数决定了它保持在 FIN-WAIT-2 状态的时间。对端可以出错并永远不关闭连接,甚至意外宕机。缺省值是 60s,2.2 内核通常是 180s,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的 WEB 服务器,也有因为大量的死套接字而内存溢出的风险,FIN-WAIT-2 的危险性比 FIN-WAIT-1 要小,因为它最多只能吃掉 1.5k 内存,但是它们的生存期长些。
net.ipv4.tcp_keepalive_TIme = 1200
表示当 keepalive 起作用的时候,TCP 发送 keepalive 消息的频度。(单位:秒,缺省值:2小时)
net.ipv4.tcp_max_orphans = 3276800
表示系统中最多有多少个 TCP 套接字不被关联到任何一个用户文件句柄上。这个限制仅仅是为了防止简单的 DoS 攻击,不能郭飞依赖依靠它或者认为地减小这个值,如果增加了内存之后,更应该增加这个值。
net.ipv4.tcp_max_syn_backlog = 262144
记录的是那些尚未收到客户端确认信息的连接请求的最大值。对于有 128M 内存的系统而言,缺省值是 1024,小内存的系统则是 128。
net.ipv4.tcp_max_tw_buckets = 6000
表示系统同时保持 TIME_WAIT 套接字的最大数量,默认是 180000。
net.ipv4.tcp_mem = 94500000 915000000 927000000
确定 TCP 栈应该如何反映内存使用;每个值的单位都是内存页(通常是 4KB):
第一个值是内存使用的下限。
第二个值是内存压力模式开始对缓冲区使用应用压力的上限。
第三个值是内存上限。在这个层次上可以将报文丢弃,从而减少对内存的使用。对于较大的 BDP 可以增大这些值(但是要记住,其单位是内存页,而不是字节)。
net.ipv4.tcp_sack = 1
启用有选择的应答(1表示启用),通过有选择地应答乱序接收到的报文来提高性能,让发送者只发送丢失的报文段,(对于广域网通信来说)这个选项应该启用,但是会增加对CPU的占用。
net.ipv4.tcp_synack_retries = 1
为了打开对端的连接,内核需要发送一个 SYN 并附带一个回应前面一个 SYN 的 ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送 SYN+ACK 包的数量。
net.ipv4.tcp_syncookies = 1
开启 SYN 洪水攻击保护。
net.ipv4.tcp_syn_retries = 1
在内核放弃建立连接之前发送 SYN 包的数量。
net.ipv4.tcp_TImestamps = 0
该参数用于设置时间戳,可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。设置为 0 表示将其关掉。
net.ipv4.tcp_tw_recycle = 0
是否开启 TCP 连接中 TIME-WAIT sockets 的快速回收,0 表示关闭,1 表示开启。当 tcp_tw_recycle 与 tcp_timestamp 同时开启时会降低连接成功率。
net.ipv4.tcp_tw_reuse = 1
是否开启重用,允许将 TIME-WAIT sockets 重新用于新的 TCP 连接,0 表示关闭,1 表示开启。
net.ipv4.tcp_window_scaling = 1
启用 RFC 1323 定义的 window scaling,要支持超过 64KB 的 TCP 窗口,必须启用该值(1表示启用),TCP窗口最大至 1GB,TCP 连接双方都启用时才生效。
net.ipv6.conf.all.disable_ipv6 = 1、net.ipv6.conf.default.disable_ipv6 = 1
禁用 IPv6
内核主要有以下4能:系统内存管理;软件程序管理;硬件管理;文件系统管理;
(1)系统内存管理
内存管理是操作系统内核的主要功能之一。内核不仅能管理可用的物理内存,还可以创建并管理虚拟内存。
内存管理必须使用硬盘空间,该空间被称为交换空间。内核不断的在该交换空间和实际物理内存之间交换虚拟内存位置的内容。这样系统的可用内存比实际内存多。
将内存位置分组为多个数据块,此操作被称为分页。内核定位物理内存或交换空间中的每个内存分页,然后维护一个内存分页页表,此表说明位于物理内存的分页和交换到磁盘的分页。内存跟踪使用的分页,并且自动将一段时间没有用到的内存分页复制到交换空间区域,称为换出过程。即使内存够也执行这个过程。当程序需要访问已经换出的分页时,内存必须换出另一个分页,以在物理内存中为该内存分页腾出空间,然后从交换空间换入需要的分页。
在Linux系统上运行的每个进程都有自己的内存分页,一个进程不能访问另一个进程正在使用的分页。内核也有自己的内存区域,出于安全考虑,任何进程都不能访问内核进程正在使用的内存。
(2)软件程序管理
正在运行的程序被称为进程。进程可以在前台运行,也可以在后台运行。
内核创建的第一个进程被称为初始进程,该进程在系统上启动所有其它进程。内核启动的时候,初始进程被加载到虚拟内存中,内存每启动一个其它进程,都将在虚拟内存中为其分配一个唯一的空间,用于储存该进程的数据和代码。
(3)硬件管理
Linux系统需要与之通信的设备都必须在内核代码中插入驱动程序代码。驱动程序代码使内核能够向设备传输数据。在Linux中插入设备驱动的程序有两种方法:
1.在内核中编译驱动程序。
2.向内核添加驱动程序模块。
Linux将硬件设备标识为特殊文件,称为设备文件。设备文件分为3种:
1.字符
2.块
3.网络
字符设备文件用于那些一次仅处理一个字符的设备。块文件用于那些一次可处理大量数据块的设备。网络文件用于那些使用数据包发送和接收数据的设备。
(4)文件系统管理
Linux系统可以使用不同类型的文件系统与硬盘传输数据。除了本身的文件系统外,还可以通过其他的操作系统使用的文件系统传输数据。Linux内核使用虚拟文件系统与每个文件系统进行连接。为内核与其他文件系统类型的通信提供了一个标准接口,挂载和使用每个文件系统时。虚拟文件系统中缓存相关的信息。