用Sysctl 调整Linux操作系统的性能

本文涉及的产品
云防火墙,500元 1000GB
简介:

Sysctl是一个允许您改变正在运行中的Linux系统的接口。它包含一些 TCP/IP 堆栈和虚拟内存系统的高级选项, 这可以让有经验的管理员提高引人注目的系统性能。用sysctl可以读取设置超过五百个系统变量。基于这点,sysctl(8) 提供两个功能:读取和修改系统设置。

查看所有可读变量:

% sysctl -a

读一个指定的变量,例如 kern.maxproc:

% sysctl kern.maxproc kern.maxproc: 1044

要设置一个指定的变量,直接用 variable=value 这样的语法:

sysctl kern.maxfiles=5000

kern.maxfiles: 2088 –> 5000

sysctl -w

-w Use this option when you want to change a sysctl setting.

注意,这个参数是用来改变当前值即虚拟文件系统/proc下的值.

sysctl -p

-p Load in sysctl settings from the file specified or /etc/sysctl.conf if none given. Specifying - as filename means reading data from standard input.

注: 指定要加载的配置文件并显示参数.如果不指定加载文件的路径,默认为:/etc/sysctl.conf

比如,如果你添加了某个参数到/etc/sysctl.conf,

echo "net.ipv4.tcp_keepalive_time=20">>/etc/sysctl.conf

那么运行sysctl -p将重新加载配置文件,这样新增加到配置文件的参数便能及时生效了.并且还会显示所有该配置文件中的参数.

您可以使用sysctl修改系统变量,也可以通过编辑sysctl.conf文件来修改系统变量。sysctl.conf 看起来很像 rc.conf。它用 variable=value 的形式来设定值。指定的值在系统进入多用户模式之后被设定。并不是所有的变量都可以在这个模式下设定。

sysctl 变量的设置通常是字符串、数字或者布尔型。 (布尔型用 1 来表示'yes',用 0 来表示'no')。

  ###############################

net.inet.ip.sourceroute=0

net.inet.ip.accept_sourceroute=0

通过源路由,攻击者可以尝试到达内部IP地址 --包括RFC1918中的地址,所以

不接受源路由信息包可以防止你的内部网络被探测。

net.inet.tcp.drop_synfin=1

安全参数,编译内核的时候加了options TCP_DROP_SYNFIN才可以用,可以阻止某些OS探测。

kern.maxvnodes=8446

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) 中显示的内存用量应有显著变化,

更多内存会处于活跃 (active) 状态。

kern.maxproc: 964

Maximum number of processes

kern.maxprocperuid: 867

Maximum processes allowed per userid

因为我的maxusers设置的是256,20+16*maxusers=4116。

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

我给它设置的2068。

kern.maxfiles: 1928

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

比如kde这样的桌面环境,它同时要用的文件非常多。

一般推荐设置为32768或者65536。

kern.argmax: 262144

maximum number of bytes (or characters) in an argument list.

命令行下最多支持的参数,比如你在用find命令来批量删除一些文件的时候

find . -name "*.old" -delete,如果文件数超过了这个数字,那么会提示你数字太多的。

可以利用find . -name "*.old" -ok rm {} ;来删除。

默认的参数已经足够多了,因此不建议再做修改。

kern.securelevel: -1

-1:这是系统默认级别,没有提供任何内核的保护错误;

0:基本上作用不多,当你的系统刚启动就是0级别的,当进入多用户模式的时候就自动变成1级了。

1:在这个级别上,有如下几个限制:

  1. 不能通过kldload或者kldunload加载或者卸载可加载内核模块;
  2. 应用程序不能通过/dev/mem或者/dev/kmem直接写内存;
  3. 不能直接往已经装在(mounted)的磁盘写东西,也就是不能格式化磁盘,但是可以通过标准的内核接口执行写操作;
  4. 不能启动X-windows,同时不能使用chflags来修改文件属性;

2:在 1 级别的基础上还不能写没装载的磁盘,而且不能在1秒之内制造多次警告,这个是防止DoS控制台的;

3:在 2 级别的级别上不允许修改IPFW防火墙的规则。

如果你已经装了防火墙,并且把规则设好了,不轻易改动,那么建议使用3级别,如果你没有装防火墙,而且还准备装防火墙的话,不建议使用。

我们这里推荐使用 2 级别,能够避免比较多对内核攻击。

 ####################################

kern.maxfilesperproc: 1735

每个进程能够同时打开的最大文件数量,网上很多资料写的是32768

除非用异步I/O或大量线程,打开这么多的文件恐怕是不太正常的。

我个人建议不做修改,保留默认。

kern.ipc.maxsockbuf: 262144

最大的套接字缓冲区,网上有建议设置为2097152(2M)、8388608(8M)的。

我个人倒是建议不做修改,保持默认的256K即可,缓冲区大了可能造成碎片、阻塞或者丢包。

kern.ipc.somaxconn: 128

最大的等待连接完成的套接字队列大小,即并发连接数。

高负载服务器和受到Dos攻击的系统也许会因为这个队列被塞满而不能提供正常服务。

默认为128,推荐在1024-4096之间,根据机器和实际情况需要改动,数字越大占用内存也越大。

kern.ipc.nmbclusters: 4800

这个值用来调整系统在开机后所要分配给网络 mbufs 的 cluster 数量,

由于每个 cluster 大小为 2K,所以当这个值为 1024 时,也是会用到 2MB 的核心内存空间。

假设我们的网页同时约有 1000 个联机,而 TCP 传送及接收的暂存区大小都是 16K,

则最糟的情况下,我们会需要 (16K+16K) * 1024,也就是 32MB 的空间,

然而所需的 mbufs 大概是这个空间的二倍,也就是 64MB,所以所需的 cluster 数量为 64MB/2K,也就是 32768。

对于内存有限的机器,建议值是 1024 到 4096 之间,而当拥有海量存储器空间时,我们可以将它设定为 4096 到 32768 之间。

我们可以使用 netstat 这个指令并加上参数 -m 来查看目前所使用的 mbufs 数量。

要修改这个值必须在一开机就修改,所以只能在 /boot/loader.conf 中加入修改的设定

kern.ipc.nmbclusters=32768

kern.ipc.shmmax: 33554432

共享内存和信号灯("System VIPC")如果这些过小的话,有些大型的软件将无法启动

安装xine和mplayer提示的设置为67108864,即64M,

如果内存多的话,可以设置为134217728,即128M

kern.ipc.shmall: 8192

共享内存和信号灯("System VIPC")如果这些过小的话,有些大型的软件将无法启动

安装xine和mplayer提示的设置为32768

kern.ipc.shm_use_phys: 0

如果我们将它设成 1,则所有 System V 共享内存 (share memory,一种程序间沟通的方式)部份都会被留在实体的内存 (physical memory) 中,

而不会被放到硬盘上的 swap 空间。我们知道物理内存的存取速度比硬盘快许多,而当物理内存空间不足时,

部份数据会被放到虚拟的内存上,从物理内存和虚拟内存之间移转的动作就叫作 swap。如果时常做 swap 的动作,

则需要一直对硬盘作 I/O,速度会很慢。因此,如果我们有大量的程序 (数百个) 需要共同分享一个小的共享内存空间,

或者是共享内存空间很大时,我们可以将这个值打开。

这一项,我个人建议不做修改,除非你的内存非常大。

kern.ipc.shm_allow_removed: 0

共享内存是否允许移除?这项似乎是在fb下装vmware需要设置为1的,否则会有加载SVGA出错的提示

作为服务器,这项不动也罢。

kern.ipc.numopensockets: 12

已经开启的socket数目,可以在最繁忙的时候看看它是多少,然后就可以知道maxsockets应该设置成多少了。

kern.ipc.maxsockets: 1928

这是用来设定系统最大可以开启的 socket 数目。如果您的服务器会提供大量的 FTP 服务,

而且常快速的传输一些小档案,您也许会发现常传输到一半就中断。因为 FTP 在传输档案时,

每一个档案都必须开启一个 socket 来传输,但关闭 socket 需要一段时间,如果传输速度很快,

而档案又多,则同一时间所开启的 socket 会超过原本系统所许可的值,这时我们就必须把这个值调大一点。

除了 FTP 外,也许有其它网络程序也会有这种问题。

然而,这个值必须在系统一开机就设定好,所以如果要修改这项设定,我们必须修改 /boot/loader.conf 才行

kern.ipc.maxsockets="16424"

kern.ipc.nsfbufs: 1456

经常使用 sendfile(2) 系统调用的繁忙的服务器,

有必要通过 NSFBUFS 内核选项或者在 /boot/loader.conf (查看 loader(8) 以获得更多细节) 中设置它的值来调节 sendfile(2) 缓存数量。

这个参数需要调节的普通原因是在进程中看到 sfbufa 状态。sysctl kern.ipc.nsfbufs 变量在内核配置变量中是只读的。

这个参数是由 kern.maxusers 决定的,然而它可能有必要因此而调整。

在/boot/loader.conf里加入

kern.ipc.nsfbufs="2496"

kern.maxusers: 59

maxusers 的值决定了处理程序所容许的最大值,20+16*maxusers 就是你将得到的所容许处理程序。

系统一开机就必须要有 18 个处理程序 (process),即便是简单的执行指令 man 又会产生 9 个 process,

所以将这个值设为 64 应该是一个合理的数目。

如果你的系统会出现 proc table full 的讯息的话,可以就把它设大一点,例如 128。

除非您的系统会需要同时开启很多档案,否则请不要设定超过 256。

可以在 /boot/loader.conf 中加入该选项的设定,

kern.maxusers=256

kern.coredump: 1

如果设置为0,则程序异常退出时不会生成core文件,作为服务器,不建议这样。

kern.corefile: %N.core

可设置为kern.corefile="/data/coredump/%U-%P-%N.core"

其中 %U是UID,%P是进程ID,%N是进程名,当然/data/coredump必须是一个实际存在的目录

vm.swap_idle_enabled: 0

vm.swap_idle_threshold1: 2

vm.swap_idle_threshold2: 10

在有很多用户进入、离开系统和有很多空闲进程的大的多用户系统中很有用。

可以让进程更快地进入内存,但它会吃掉更多的交换和磁盘带宽。

系统默认的页面调度算法已经很好了,最好不要更改。

vfs.ufs.dirhash_maxmem: 2097152

默认的dirhash最大内存,默认2M

增加它有助于改善单目录超过100K个文件时的反复读目录时的性能

建议修改为33554432(32M)

vfs.vmiodirenable: 1

这个变量控制目录是否被系统缓存。大多数目录是小的,在系统中只使用单个片断(典型的是1K)并且在缓存中使用的更小 (典型的是512字节)。

当这个变量设置为关闭 (0) 时,缓存器仅仅缓存固定数量的目录,即使您有很大的内存。

而将其开启 (设置为1) 时,则允许缓存器用 VM 页面缓存来缓存这些目录,让所有可用内存来缓存目录。

不利的是最小的用来缓存目录的核心内存是大于 512 字节的物理页面大小(通常是 4k)。

我们建议如果您在运行任何操作大量文件的程序时保持这个选项打开的默认值。

这些服务包括 web 缓存,大容量邮件系统和新闻系统。

尽管可能会浪费一些内存,但打开这个选项通常不会降低性能。但还是应该检验一下。

vfs.hirunningspace: 1048576

这个值决定了系统可以将多少数据放在写入储存设备的等候区。通常使用默认值即可,

但当我们有多颗硬盘时,我们可以将它调大为 4MB 或 5MB。

注意这个设置成很高的值(超过缓存器的写极限)会导致坏的性能。

不要盲目的把它设置太高!高的数值会导致同时发生的读操作的迟延。

vfs.write_behind: 1

这个选项预设为 1,也就是打开的状态。在打开时,在系统需要写入数据在硬盘或其它储存设备上时,

它会等到收集了一个 cluster 单位的数据后再一次写入,否则会在一个暂存区空间有写入需求时就立即写到硬盘上。

这个选项打开时,对于一个大的连续的文件写入速度非常有帮助。但如果您遇到有很多行程延滞在等待写入动作时,您可能必须关闭这个功能。

net.local.stream.sendspace: 8192

本地套接字连接的数据发送空间

建议设置为65536

net.local.stream.recvspace: 8192

本地套接字连接的数据接收空间

建议设置为65536

net.inet.ip.portrange.lowfirst: 1023

net.inet.ip.portrange.lowlast: 600

net.inet.ip.portrange.first: 49152

net.inet.ip.portrange.last: 65535

net.inet.ip.portrange.hifirst: 49152

net.inet.ip.portrange.hilast: 65535

以上六项是用来控制TCP及UDP所使用的port范围,这个范围被分成三个部份,低范围、预设范围、及高范围。

这些是你的服务器主动发起连接时的临时端口的范围,预设的已经1万多了,一般的应用就足够了。

如果是比较忙碌的FTP server,一般也不会同时提供给1万多人访问的,

当然如果很不幸,你的服务器就要提供很多,那么可以修改first的值,比如直接用1024开始

net.inet.ip.redirect: 1

设置为0,屏蔽ip重定向功能

net.inet.ip.rtexpire: 3600

net.inet.ip.rtminexpire: 10

很多apache产生的CLOSE_WAIT状态,这种状态是等待客户端关闭,但是客户端那边并没有正常的关闭,于是留下很多这样的东东。

建议都修改为2

本文来自云栖社区合作伙伴“doNET跨平台”,了解相关信息可以关注“opendotnet”微信公众号

目录
相关文章
|
16天前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
43 1
|
11天前
|
运维 监控 Linux
BPF及Linux性能调试探索初探
BPF技术从最初的网络数据包过滤发展为强大的系统性能优化工具,无需修改内核代码即可实现实时监控、动态调整和精确分析。本文深入探讨BPF在Linux性能调试中的应用,介绍bpftune和BPF-tools等工具,并通过具体案例展示其优化效果。
40 14
|
18天前
|
安全 Linux 数据安全/隐私保护
深入Linux操作系统:文件系统和权限管理
在数字世界的海洋中,操作系统是连接用户与硬件的桥梁,而Linux作为其中的佼佼者,其文件系统和权限管理则是这座桥梁上不可或缺的结构。本文将带你探索Linux的文件系统结构,理解文件权限的重要性,并通过实际案例揭示如何有效地管理和控制这些权限。我们将一起航行在Linux的命令行海洋中,解锁文件系统的奥秘,并学习如何保护你的数据免受不必要的访问。
|
19天前
|
搜索推荐 Linux
深入理解Linux操作系统的启动过程
本文旨在揭示Linux操作系统从开机到完全启动的神秘面纱,通过逐步解析BIOS、引导加载程序、内核初始化等关键步骤,帮助读者建立对Linux启动流程的清晰认识。我们将探讨如何自定义和优化这一过程,以实现更高效、更稳定的系统运行。
|
16天前
|
存储 缓存 网络协议
Linux操作系统的内核优化与性能调优####
本文深入探讨了Linux操作系统内核的优化策略与性能调优方法,旨在为系统管理员和高级用户提供一套实用的指南。通过分析内核参数调整、文件系统选择、内存管理及网络配置等关键方面,本文揭示了如何有效提升Linux系统的稳定性和运行效率。不同于常规摘要仅概述内容的做法,本摘要直接指出文章的核心价值——提供具体可行的优化措施,助力读者实现系统性能的飞跃。 ####
|
17天前
|
缓存 监控 网络协议
Linux操作系统的内核优化与实践####
本文旨在探讨Linux操作系统内核的优化策略与实际应用案例,深入分析内核参数调优、编译选项配置及实时性能监控的方法。通过具体实例讲解如何根据不同应用场景调整内核设置,以提升系统性能和稳定性,为系统管理员和技术爱好者提供实用的优化指南。 ####
|
19天前
|
运维 监控 Linux
Linux操作系统的守护进程与服务管理深度剖析####
本文作为一篇技术性文章,旨在深入探讨Linux操作系统中守护进程与服务管理的机制、工具及实践策略。不同于传统的摘要概述,本文将以“守护进程的生命周期”为核心线索,串联起Linux服务管理的各个方面,从守护进程的定义与特性出发,逐步深入到Systemd的工作原理、服务单元文件编写、服务状态管理以及故障排查技巧,为读者呈现一幅Linux服务管理的全景图。 ####
|
22天前
|
消息中间件 安全 Linux
深入探索Linux操作系统的内核机制
本文旨在为读者提供一个关于Linux操作系统内核机制的全面解析。通过探讨Linux内核的设计哲学、核心组件、以及其如何高效地管理硬件资源和系统操作,本文揭示了Linux之所以成为众多开发者和组织首选操作系统的原因。不同于常规摘要,此处我们不涉及具体代码或技术细节,而是从宏观的角度审视Linux内核的架构和功能,为对Linux感兴趣的读者提供一个高层次的理解框架。
|
23天前
|
人工智能 安全 Linux
Linux操作系统的演变与未来趋势###
本文深入探讨了Linux操作系统从诞生至今的发展历程,分析了其开源模式对技术创新和IT行业的影响,并展望了Linux在未来技术生态中的角色。通过历史回顾、现状分析和未来预测,本文旨在为读者提供一个关于Linux操作系统全面而深入的视角。 ###
|
23天前
|
缓存 网络协议 Linux
深入探索Linux操作系统的内核优化策略####
本文旨在探讨Linux操作系统内核的优化方法,通过分析当前主流的几种内核优化技术,结合具体案例,阐述如何有效提升系统性能与稳定性。文章首先概述了Linux内核的基本结构,随后详细解析了内核优化的必要性及常用手段,包括编译优化、内核参数调整、内存管理优化等,最后通过实例展示了这些优化技巧在实际场景中的应用效果,为读者提供了一套实用的Linux内核优化指南。 ####
45 1