Linux内核调优之Sysctl研究(原创)

sysctl 是一个用来在系统运作中查看及调整系统参数的工具,它包含一些 TCP/IP 堆栈和虚拟内存系统的高级选项, 这可以让有经验的管理员提高引人注目的系统性能。用sysctl可以读取设置超过五百个系统变量。基于这点,sysctl(8) 提供两个功能:读取和修改系统设置。有的 sysctl 参数只是用来回报目前的系统状况,例如回报目前已开机时间、所使用的操作系统版本、核心名称等等;而有的可以让我们修改参数以调整系统运作的行为,例如网 络暂存内存的大小、最大的上线人数等等。而这些可以调整的参数中必须在一开机系统执行其它程序前就设定好,有的可以在开机完后任意调整。
查看所有可读变量:
# sysctl -a 
读一个指定的变量,例如 kern.maxproc:
# sysctl kern.maxproc kern.maxproc: 1044 
要设置一个指定的变量,直接用 variable=value 这样的语法:
# sysctl kern.maxfiles=5000
kern.maxfiles: 2088 -> 5000 
您可以使用sysctl修改系统变量,也可以通过编辑sysctl.conf文件来修改系统变量。sysctl.conf 看起来很像 rc.conf。它用 variable=value 的形式来设定值。指定的值在系统进入多用户模式之后被设定。并不是所有的变量都可以在这个模式下设定。
sysctl 变量的设置通常是字符串、数字或者布尔型。 (布尔型用 1 来表示'yes',用 0 来表示'no')。例如
#sysctl -w kernel.sysrq=0 
下面是对/etc/sysctl.conf配置文件的一些中文注释。在对服务器性能进行调整的时候可能会用得上!
#最大的待发送TCP数据缓冲区空间 
net.inet.tcp.sendspace=65536 

#最大的接受TCP缓冲区空间 
net.inet.tcp.recvspace=65536 

#最大的接受UDP缓冲区大小 
net.inet.udp.sendspace=65535 

#最大的发送UDP数据缓冲区大小 
net.inet.udp.maxdgram=65535 

#本地套接字连接的数据发送空间 
net.local.stream.sendspace=65535 

#加快网络性能的协议 
net.inet.tcp.rfc1323=1 
net.inet.tcp.rfc1644=1 
net.inet.tcp.rfc3042=1 
net.inet.tcp.rfc3390=1 

#最大的套接字缓冲区 
kern.ipc.maxsockbuf=2097152 

#系统中允许的最多文件数量 
kern.maxfiles=65536 

#每个进程能够同时打开的最大文件数量 
kern.maxfilesperproc=32768 

#当一台计算机发起TCP连接请求时,系统会回应ACK应答数据包。该选项设置是否延迟ACK应答数据包,把它和包含数据的数据包一起发送,在高速网络和低负载的情况下会略微提高性能,但在网络连接较差的时候,对方计算机得不到应答会持续发起连接请求,反而会降低性能。 
net.inet.tcp.delayed_ack=0 

#屏蔽ICMP重定向功能 
net.inet.icmp.drop_redirect=1 
net.inet.icmp.log_redirect=1 
net.inet.ip.redirect=0 
net.inet6.ip6.redirect=0 

#防止ICMP广播风暴 
net.inet.icmp.bmcastecho=0 
net.inet.icmp.maskrepl=0 

#限制系统发送ICMP速率 
net.inet.icmp.icmplim=100 

#安全参数,编译内核的时候加了options TCP_DROP_SYNFIN才可以用 
net.inet.icmp.icmplim_output=0 
net.inet.tcp.drop_synfin=1 

#设置为1会帮助系统清除没有正常断开的TCP连接,这增加了一些网络带宽的使用,但是一些死掉的连接最终能被识别并清除。死的TCP连接是被拨号用户存取的系统的一个特别的问题,因为用户经常断开modem而不正确的关闭活动的连接 
net.inet.tcp.always_keepalive=1 

#若看到net.inet.ip.intr_queue_drops这个在增加,就要调大net.inet.ip.intr_queue_maxlen,为0最好 
net.inet.ip.intr_queue_maxlen=1000 

#防止DOS攻击,默认为30000 
net.inet.tcp.msl=7500 

#接收到一个已经关闭的端口发来的所有包,直接drop,如果设置为1则是只针对TCP包 
net.inet.tcp.blackhole=2 

#接收到一个已经关闭的端口发来的所有UDP包直接drop 
net.inet.udp.blackhole=1 

#为网络数据连接时提供缓冲 
net.inet.tcp.inflight.enable=1 

#如果打开的话每个目标地址一次转发成功以后它的数据都将被记录进路由表和arp数据表,节约路由的计算时间,但会需要大量的内核内存空间来保存路由表 
net.inet.ip.fastforwarding=0 

#kernel编译打开options POLLING功能,高负载情况下使用低负载不推荐SMP不能和polling一起用 
#kern.polling.enable=1 

#并发连接数,默认为128,推荐在1024-4096之间,数字越大占用内存也越大 
kern.ipc.somaxconn=32768 

#禁止用户查看其他用户的进程 
security.bsd.see_other_uids=0 

#设置kernel安全级别 
kern.securelevel=0 

#记录下任何TCP连接 
net.inet.tcp.log_in_vain=1 

#记录下任何UDP连接 
net.inet.udp.log_in_vain=1 

#防止不正确的udp包的攻击 
net.inet.udp.checksum=1 

#防止DOS攻击 
net.inet.tcp.syncookies=1 

#仅为线程提供物理内存支持,需要256兆以上内存 
kern.ipc.shm_use_phys=1 

# 线程可使用的最大共享内存 
kern.ipc.shmmax=67108864 

# 最大线程数量 
kern.ipc.shmall=32768 

# 程序崩溃时不记录 
kern.coredump=0 

# lo本地数据流接收和发送空间 
net.local.stream.recvspace=65536 
net.local.dgram.maxdgram=16384 
net.local.dgram.recvspace=65536 

# 数据包数据段大小,ADSL为1452。 
net.inet.tcp.mssdflt=1460 

# 为网络数据连接时提供缓冲 
net.inet.tcp.inflight_enable=1 

# 数据包数据段最小值,ADSL为1452 
net.inet.tcp.minmss=1460 

# 本地数据最大数量 
net.inet.raw.maxdgram=65536 

# 本地数据流接收空间 
net.inet.raw.recvspace=65536 

#ipfw防火墙动态规则数量,默认为4096,增大该值可以防止某些病毒发送大量TCP连接,导致不能建立正常连接 
net.inet.ip.fw.dyn_max=65535 

#设置ipf防火墙TCP连接空闲保留时间,默认8640000(120小时) 
net.inet.ipf.fr_tcpidletimeout=864000

#默认的接收TCP窗口大小

net.core.rmem_default = 256960

#最大的TCP数据接收缓冲 
net.core.rmem_max = 256960

#默认的发送TCP窗口大小 
net.core.wmem_default = 256960

#最大的TCP数据发送缓冲
net.core.wmem_max = 256960

#以一种比重发超时更精确的方法(请参阅 RFC 1323)来启用对 RTT 的计算;为了实现更好的性能应该启用这个选项 
net.ipv4.tcp_timestamps = 0

#启用有选择的应答(Selective Acknowledgment),这可以通过有选择地应答乱序接收到的报文来提高性能(这样可以让发送者只发送丢失的报文段);(对于广域网通信来说)这个选项应该启用,但是这会增加对 CPU 的占用。 
net.ipv4.tcp_sack =1

#启用转发应答(Forward Acknowledgment),这可以进行有选择应答(SACK)从而减少拥塞情况的发生;这个选项也应该启用。

net.ipv4.tcp_fack =1

#支持更大的TCP窗口. 如果TCP窗口最大超过65535(64K), 必须设置该数值为1 
net.ipv4.tcp_window_scaling = 1

#确定 TCP 栈应该如何反映内存使用;每个值的单位都是内存页(通常是 4KB)。第一个值是内存使用的下限。第二个值是内存压力模式开始对缓冲区使用应用压力的上限。第三个值是内存上限。在这个层次上可以将报文丢弃,从而减少对内存的使用。

net.ipv4.tcp_mem= 24576 32768 49152

#为自动调优定义每个 socket 使用的内存。第一个值是为socket 的发送缓冲区分配的最少字节数。第二个值是默认值(该值会被 wmem_default 覆盖),缓冲区在系统负载不重的情况下可以增长到这个值。第三个值是发送缓冲区空间的最大字节数(该值会被 wmem_max 覆盖)。

net.ipv4.tcp_wmem= 4096 16384 131072

#与 tcp_wmem 类似,不过它表示的是为自动调优所使用的接收缓冲区的值

net.ipv4.tcp_rmem= 4096 87380 174760

#允许 TCP/IP 栈适应在高吞吐量情况下低延时的情况;这个选项应该禁用。

net.ipv4.tcp_low_latency= 0

#启用发送者端的拥塞控制算法,它可以维护对吞吐量的评估,并试图对带宽的整体利用情况进行优化;对于 WAN 通信来说应该启用这个选项

net.ipv4.tcp_westwood= 0

#为快速长距离网络启用 Binary Increase Congestion;这样可以更好地利用以 GB 速度进行操作的链接;对于 WAN 通信应该启用这个选项。

net.ipv4.tcp_bic= 1

 

#通过源路由,攻击者可以尝试到达内部IP地址 –包括RFC1918中的地址,所以不接受源路由信息包可以防止你的内部网络被探测。

net.inet.ip.sourceroute=0
net.inet.ip.accept_sourceroute=0

#vnode 是对文件或目录的一种内部表达。 因此, 增加可以被操作系统利用的 vnode 数量将降低磁盘的 I/O。一般而言, 这是由操作系统自行完成的,也不需要加以修改。但在某些时候磁盘 I/O 会成为瓶颈,而系统的 vnode 不足, 则这一配置应被增加。此时需要考虑是非活跃和空闲内存的数量。要查看当前在用的 vnode 数量:
# sysctl vfs.numvnodes
vfs.numvnodes: 91349

要查看最大可用的 vnode 数量:
# sysctl kern.maxvnodes
kern.maxvnodes: 100000
如果当前的 vnode 用量接近最大值,则将 kern.maxvnodes 值增大 1,000 可能是个好主意。
您应继续查看 vfs.numvnodes 的数值, 如果它再次攀升到接近最大值的程度,
仍需继续提高 kern.maxvnodes。 在 top(1) 中显示的内存用量应有显著变化,

kern.maxvnodes=8446

#最大的进程数

kern.maxproc= 964

#每个用户id允许的最大进程数

kern.maxprocperuid=867

注意,maxprocperuid至少要比maxproc少1,因为init(8) 这个系统程序绝对要保持在运作状态。

#系统中支持最多同时开启的文件数量,如果你在运行数据库或大的很吃描述符的进程,那么应该设置在20000以上

kern.maxfiles=2221928

参考至:http://dev.csdn.net/htmls/73/73907.html
            http://www.boear.com/article/09-08/205.html

            http://www.ibm.com/developerworks/cn/linux/l-hisock.html

            http://blog.sina.com.cn/s/blog_60359c5b0100is8y.html

本文原创,转载请注明作者、出处

如有错误,欢迎指正

邮箱:czmcj@163.com

作者:czmmiao 原文地址:http://czmmiao.iteye.com/blog/1054966

时间: 2024-09-10 05:22:26

Linux内核调优之Sysctl研究(原创)的相关文章

LAMP 系统性能调优之内核调优措施

LAMP LAMP的一些快速的内核调优措施 大多数 Linux 发布版都定义了适当的缓冲区和其他 Transmission Control  Protocol(TCP)参数.可以修改这些参数来分配更多的内存,从而改进网络性能.设置内核参数的方法是通过 proc 接口,也就是通过读写  /proc 中的值.幸运的是,sysctl 可以读取 /etc/sysctl.conf 中的值并根据需要填充  /proc,这样就能够更轻松地管理这些参数.清单 2 展示在互联网服务器上应用于 Internet 服

<Linux性能调优指南>主要思路流程

网上IBM很早放出的一本免费电子书, 十来年了,参考意义还是很大. 国内有翻译成中文在线阅读的版本. 见如下两个URL Linux Performance and Tuning Guidelines <Linux性能调优指南> https://www.gitbook.com/book/lihz1990/transoflptg/details ========================================= 服务器优化思路 管理变更流程 管理变更和性能优化并不直接相关,但可能是

Linux操作系统调优参数有具体含义

所有的TCP/IP调优参数都位于/proc/sys/net/目录.例如, 下面是最重要的一些调优参数,后面是它们的含义: 1./proc/sys/net/core/rmem_max - 最大的TCP数据接收缓冲 2./proc/sys/net/core/wmem_max - 最大的TCP数据发送缓冲 3./proc/sys/net/ipv4/tcp_timestamps - 时间戳在(请参考RFC 1323)TCP的包头增加12个字节 4./proc/sys/net/ipv4/tcp_sack

Linux系统调优参数知多少?

所有的TCP/IP调优参数都位于/proc/sys/net/目录.例如,下面是最重要的一些调优参数,后面是它们的含义: 1./proc/sys/net/core/rmem_max - 最大的TCP数据接收缓冲 2./proc/sys/net/core/wmem_max - 最大的TCP数据发送缓冲 3./proc/sys/net/ipv4/tcp_timestamps - 时间戳在(请参考RFC 1323)TCP的包头增加12个字节 4./proc/sys/net/ipv4/tcp_sack -

Linux系统性能调优之性能分析

性能调优的第一步是性能分析,下面从性能分析着手进行一些介绍,尤其对Linux性能分析工具vmstat的用法和实践进行详细介绍. 1.性能分析的目的 1)找出系统性能瓶颈(包括硬件瓶颈和软件瓶颈): 2)提供性能优化的方案(升级硬件?改进系统系统结构?): 3)达到合理的硬件和软件配置: 4)使系统资源使用达到最大的平衡.(一般情况下系统良好运行的时候恰恰各项资源达到了一个平衡体,任何一项资源的过渡使用都会造成平衡体系破坏,从而造成系统负载极高或者响应迟缓.比如CPU过渡使用会造成大量进程等待CP

关于Linux内核读取磁盘序列号的研究

一向的观点就是"别在内核里面处理字符串"!事实上,确实应该如此! Linux内核的块设备驱动有能力读取磁盘的序列号,这个数据存储在磁盘的控制芯片ROM里面.内核应该以怎样的形式将这个序列号呈现给调用者呢?我们ls一下这个目录: /dev/disk/by-id ll /dev/disk/by-id/ ... lrwxrwxrwx 1 root root 9 10月 17 10:11 scsi-SATA_ST3500413AS_Z2A2AGQA -> ../../sdb 可以看到,一

Linux内核驱动--mmap设备方法【原创】

mmap系统调用(功能) void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset) 内存映射函数mmap , 负责把文件内容映射到进程的虚拟内存空间,通过对这段内存的读取和修改,来实现对文件的读取和修改,而不需要再调用read, write等操作.   addr:        指定映射的起始地址,通常设为NULL, 由系统指定. len:          映射到内存的文件长度 prot:    

Linux性能调优基本策略设定

关于ulimit ulimit -a 用来显示当前的各种用户进程限制. Linux对于每个用户,系统限制其最大进程数.为提高性能,可以根据设备资源情况,设置各linux 用户的最大进程数,下面我把某linux用户的最大进程数设为10000个: ulimit -u 10000 对于需要做许多 socket 连接并使它们处于打开状态的 Java 应用程序而言,最好通过使用 ulimit -n xx 修改每个进程可打开的文件数,缺省值是 1024. ulimit -n 4096 将每个进程可以打开的文

这是一篇最通熟易懂的性能调优总结!

精彩早知道 作者概述 什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么人来进行性能调优?(who) 怎么样进行性能调优?(How) 总结 硬件配置:CUP Xeon E5620 x 2 8核心, 内存 16G , 硬盘 RAID 10 操作系统: CentOS 6.4 x86_64(64位)  一.作者概述 在这篇博文中,我不想用一些抽象的概念去说性能调优的问题,只想用最通俗的语言尽量来准确的表达我的想法