linux几个内核参数优化配置

1、设置内存分配策略:vm.overcommit_memory

#查看配置

cat /proc/sys/vm/overcommit_memory

#解释

0、表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。

1、表示内核允许分配所有的物理内存,而不管当前的内存状态如何。

2、表示内核允许分配超过所有物理内存和交换空间总和的内存

#修改配置值为1,三种方式(root权限):

A、echo "vm.overcommit_memory=1" > /etc/sysctl.conf  或 vi /etc/sysctl.conf,然后reboot重启机器

B、echo 1 > /proc/sys/vm/overcommit_memory  不需要启机器就生效

C、sysctl vm.overcommit_memory=1

#什么是Overcommit和OOM

Linux对大部分申请内存的请求都回复"yes",以便能跑更多更大的程序。因为申请内存后,并不会马上使用内存。这种技术叫做Overcommit。当linux发现内存不足时,会发生OOM killer(OOM=out-of-memory)。它会选择杀死一些进程(用户态进程,不是内核线程),以便释放内存。

当oom-killer发生时,linux会选择杀死哪些进程?选择进程的函数是oom_badness函数(在mm/oom_kill.c中),该函数会计算每个进程的点数(0~1000)。点数越高,这个进程越有可能被杀死。每个进程的点数跟oom_score_adj有关,而且oom_score_adj可以被设置(-1000最低,1000最高)。

2、swapiness

#解释

linux 会使用硬盘的一部分做为SWAP分区,用来进行进程调度--进程是正在运行的程序--把当前不用的进程调成‘等待(standby)‘,甚至‘睡眠(sleep)’,一旦要用,再调成‘活(active)’,睡眠的进程就躺到SWAP分区睡大觉,把内存空出来让给‘活动’的进程。

如果内存够大,应当告诉linux不必太多的使用SWAP分区,可以通过修改swappiness的数值。swappiness=0的时候表示最大限度使用物理内存,然后才是swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。

#修改前的准备

cat /proc/version,查看linux内核版本

如果linux内核版本<3.5,那么swapiness设置为0,这样系统宁愿swap也不会oom killer(杀掉进程)

如果linux内核版本>=3.5,那么swapiness设置为1,这样系统宁愿swap也不会oom killer

#临时修改

echo 0 > /proc/sys/vm/swappiness

#永久修改,需要reboot

echo vm.swapiness=0 >> /etc/sysctl.conf 或 vi /etc/sysctl.conf,然后reboot重启机器

3、ulimit

#解释

显示(或设置)用户可以使用的资源的限制(limit),这限制分为软限制(当前限制)和硬限制(上限),其中硬限制是软限制的上限值,应用程序在运行过程中使用的系统资源不超过相应的

软限制,任何的超越都导致进程的终止。

#命令参数解释

-a 列出所有当前资源极限

-c 设置core文件的最大值.单位:blocks

-d 设置一个进程的数据段的最大值.单位:kbytes

-f Shell 创建文件的文件大小的最大值,单位:blocks

-h 指定设置某个给定资源的硬极限。如果用户拥有 root 用户权限,可以增大硬极限。任何用户均可减少硬极限

-l 可以锁住的物理内存的最大值

-m 可以使用的常驻内存的最大值,单位:kbytes

-n 每个进程可以同时打开的最大文件数

-p 设置管道的最大值,单位为block,1block=512bytes

-s 指定堆栈的最大值:单位:kbytes

-S 指定为给定的资源设置软极限。软极限可增大到硬极限的值。如果 -H 和 -S 标志均未指定,极限适用于以上二者

-t 指定每个进程所使用的秒数,单位:seconds

-u 可以运行的最大并发进程数

-v Shell可使用的最大的虚拟内存,单位:kbytes

#查看单个进程最多打开的资源数(即并发连接)

ulimit -n

#修改配置

ulimit -n 65536

4、somaxconn

#解释

对于一个TCP连接,Server与Client需要通过三次握手来建立网络连接.当三次握手成功后, 我们可以看到端口的状态由LISTEN转变为ESTABLISHED,接着这条链路上就可以开始传送数据了。

每一个处于监听(Listen)状态的端口,都有自己的监听队列.监听队列的长度

#查看队列大小

cat /proc/sys/net/core/somaxconn

#修改队列大小

echo 1024 > /proc/sys/net/core/somaxconn

或者

永久生效: 

vim /etc/sysctl.conf net.core.somaxconn=32768 

sysctl -p 

立即生效:

sysctl -w net.core.somaxconn=32768

备注

sysctl命令被用于在内核运行时动态地修改内核的运行参数,可用的内核参数在目录/proc/sys中。它包含一些TCP/ip堆栈和虚拟内存系统的高级选项, 这可以让有经验的管理员提高引人注目

的系统性能。用sysctl可以读取设置超过五百个系统变量。

-n:打印值时不打印关键字;

-e:忽略未知关键字错误;

-N:仅打印名称;

-w:当改变sysctl设置时使用此项;

-p:从配置文件“/etc/sysctl.conf”加载内核参数设置;

-a:打印当前所有可用的内核参数变量和值;

-A:以表格方式打印当前所有可用的内核参数变量和值。

猜你喜欢

转载自hengdu.iteye.com/blog/2405924