limits和sysctl配置详解.docx
《limits和sysctl配置详解.docx》由会员分享,可在线阅读,更多相关《limits和sysctl配置详解.docx(39页珍藏版)》请在冰豆网上搜索。
limits和sysctl配置详解
limits.conf和sysctl.conf那些事儿
1.limits.conf
/etc/security/limits.conf
工作原理:
limits.conf文件实际是LinuxPAM(插入式认证模块,PluggableAuthenticationModules中pam_limits.so的配置文件),突破系统的默认限制,对系统访问资源有一定保护作用,当用户访问服务器时,服务程序将请求发送到PAM模块,PAM模块根据服务名称在/etc/pam.d目录下选择一个对应的服务文件,然后根据服务文件的内容选择具体的PAM模块进行处理。
limits.conf和sysctl.conf区别在于limits.conf是针对用户,而sysctl.conf是针对整个系统参数配置。
文件格式:
username|@groupnametyperesourcelimi
1)username|@groupname
设置需要被限制的用户名,组名前面加@和用户名区别。
也可用通配符*来做所有用户的限制
2)type
类型有soft,hard和-
●soft指的是当前系统生效的设置值。
●hard表明系统中所能设定的最大值,soft的限制不能比hard限制高。
●-表明同时设置了soft和hard的值。
3)resource:
表示要限制的资源
●core-限制内核文件的大小
●corefile:
当一个程序崩溃时,在进程当前工作目录的core文件中复制了该进程的存储映像。
core文件仅仅是一个内存映象(同时加上调试信息),主要是用来调试的。
core文件是个二进制文件,需要用相应的工具来分析程序崩溃时的内存映像,系统默认core文件的大小为0,所以没有被创建。
可以用ulimit命令查看和修改core文件的大小。
#ulimit-c0#ulimit-c1000#ulimit-cunlimited注意:
如果想让修改永久生效,则需要修改配置文件,如.bash_profile、/etc/profile或/etc/security/limits.conf
●date-最大数据大小
●fsize-最大文件大小
●memlock-最大锁定内存地址空间
●nofile-打开文件的最大数目。
对于需要做许多套接字连接并使它们处于打开状态的应用程序而言,最好通过使用ulimit-n,或者通过设置nofile参数,为用户把文件描述符的数量设置得比默认值高一些。
●rss-最大持久设置大小
●stack-最大栈大小
●cpu-以分钟为单位的最多CPU时间
●noproc-进程的最大数目
●as-地址空间限制
●maxlogins-此用户允许登录的最大数目
通过ulimit-a可以查看限制数量
a)Centos5/6
centos5/6,只需要关注/etc/security/limits.conf和/etc/security/limits.d/下配置文件
●Centos5/6永久修改openfiles数量
1)在/etc/security/limits.conf下,添加以下两行
*softnofile65535
*hardnofile65535
2)重启服务器
通过ulimit-a查看,如上面没有生效,添加如下步骤:
1)find/-namepam_limits.so
2)在/etc/pam.d/login下结尾处添加:
sessionrequired/usr/lib64/security/pam_limits.so
路径为第1步查找时给的结果反馈
3)重启服务器
注:
ulimit其实就是对单一程序的限制,进程级别的。
/proc/sys/fs/file-max,该参数指定系统范围内所有进程可以打开的文件句柄的数量限制。
●Centos5/6永久修改file-max参数
vi/etc/sysctl.conf
fs.file-max=2000000
sysctl-p
cat/proc/sys/fs/file-max
●Centos5/6修改maxusermemory数量
1)在/etc/security/limits.d/90-nproc.conf下,修改以下行(建议值65535)
*softnproc1024
b)Centos7
centos7,/etc/security/limits.conf和/etc/security/limits.d/仅适用于通过PAM认证登录用户的资源限制(PAM认证顺序:
Service(服务)→PAM(配置文件)→pam_*.so。
PAM认证首先要确定那一项服务,然后加载相应的PAM的配置文件(位于/etc/pam.d下),最后调用认证文件(位于/lib/security下)进行安全认证。
),但是对systemd的service资源限制不生效。
对于systemdservice的资源限制主要依靠 /etc/systemd/system.conf和/etc/systemd/user.conf,同时也会加载两个对应的目录中的所有.conf文件/etc/systemd/system.conf.d/*.conf和/etc/systemd/user.conf.d/*.conf。
system.conf是系统实例使用的,user.conf用户实例使用的。
一般的service,使用system.conf中的配置即可
针对单个Service也可以设置,比如nginx.service
LimitNOFILE=65535
LimitNPROC=65535
●Centos7永久修改openfiles数量
1)在/etc/security/limits.conf下,添加以下两行
*softnofile65535
*hardnofile65535
2)重启服务器
通过ulimit-a查看,如上面没有生效,添加如下步骤:
1)find/-namepam_limits.so
2)在/etc/pam.d/login下结尾处添加:
sessionrequired/usr/lib64/security/pam_limits.so
路径为第1步查找时给的结果反馈
3)重启服务器
注:
ulimit其实就是对单一进程的限制,进程级别的。
/proc/sys/fs/file-max,该参数指定系统范围内所有进程可以打开的文件句柄的数量限制。
●Centos7永久修改file-max参数
vi/etc/sysctl.conf
fs.file-max=2000000
sysctl-p
cat/proc/sys/fs/file-max
●Centos7修改maxusermemory数量
vi/etc/systemd/system.conf
DefaultLimitNPROC=100000
重启服务器
cat/proc/mysql的PID/limits
注:
Centos7一次性修改core、max_processes、max_open_file三个参数方法
vi/etc/systemd/system.conf
DefaultLimitCORE=infinity
DefaultLimitNOFILE=100000(建议值65535)
DefaultLimitNPROC=100000(建议值65535)
重启服务器
cat/proc/mysql的PID/limits
2.sysctl.conf(内核版本3.10)
/proc/sys目录下存放着大多数内核参数,并且可以在系统运行时进行更改,不过重新启动机器就会失效。
/etc/sysctl.conf是一个允许改变正在运行中的Linux系统接口,它包含一些TCP/IP堆栈和虚拟内存系统的高级选项,修改内核参数永久生效。
也就是说/proc/sys下内核文件与配置文件sysctl.conf中变量存在着对应关系。
常见参数及设置:
c)fs
●fs.aio-max-nr
表示同时拥有的异步IO请求数量。
Oracle建议将该参数设置为1048576或更高。
默认值:
65536
fs.aio-nr
表示当前IO请求数量。
该参数为只读参数。
●fs.epoll.max_user_watches
一个用户能够往epoll内核事件表注册的事件总量,它是指该用户打开的所有epoll实例总共能监听的事件数目,而不是单个epoll实例能监听的事件数目。
这个内核参数限制了epoll使用的内核内存总量。
默认值:
411648。
●fs.file-max
表示系统级文件描述符数限制最大值,是对整个系统的限制,并不是针对用户的。
当前测试环境默认为198266。
建议计算的公式:
grep-rMemTotal/proc/meminfo|awk'{printf("%d",$2/10)}'
●fs.file-nr
文件与file-max相关,它有三个值:
已分配文件句柄的数目,已使用文件句柄的数目,文件句柄的最大数目,该文件是只读的,仅用于显示信息。
●fs.inode-state
此文件保存了三个值,前两个分别表示已分配inode数和空闲inode数。
第三个是已超出系统最大inode值的数量,此时系统需清除排查inode列表
●inotify-tools相关内核参数
fs.inotify.max_queued_events:
表示调用inotify_init时分配给inotifyinstance中可排队的event的数目的最大值,超出这个值的事件被丢弃,但会触发IN_Q_OVERFLOW事件。
fs.inotify.max_user_instances:
表示每一个realuserID可创建的inotifyinstatnces的数量上限。
fs.inotify.max_user_watches:
表示每个inotifyinstatnces可监控的最大目录数量。
如果监控的文件数目巨大,需要根据情况,适当增加此值的大小。
●租借锁相关内核参数
fs.lease-break-time=45:
表示租借锁时间为45s
fs.leases-enable=1:
表示启用租借锁,默认状态启用。
●fs.nr_open
表示单个进程可分配的最大文件数,注意ulimit的nofilehardlimit不能超过该值,否则会造成无法登录。
默认值为:
1048576。
●fs.protected_hardlinks
用于限制普通用户建立硬链接
0:
不限制用户建立硬链接
1:
限制,如果文件不属于用户,或者用户对此用户没有读写权限,则不能建立硬链接
默认值为:
1。
●fs.protected_symlinks=1
用于限制普通用户建立软链接
0:
不限制用户建立软链接
1:
限制,允许用户建立软连接的情况是软连接所在目录是全局可读写目录或者软连接的uid与跟从者的uid匹配,又或者目录所有者与软连接所有者匹配
默认值:
1。
●fs.suid_dumpable
表示如果一个程序设定了setuid,那么普通用户在默认情况下不生成core文件,只有当该参数为1时,才会产生。
默认值为0。
d)kernel
●kernel.cad_pid
表示接收Ctrl+Alt+Del操作的INT信号的进程的PID
默认值为1。
●kernel.ctrl-alt-del
该值表示控制系统在接收到ctrl+alt+delete按键组合时如何反应:
1:
不捕获ctrl-alt-del,将系统类似于直接关闭电源
0:
捕获ctrl-alt-del,并将此信号传至cad_pid保存的PID号进程进行处理
默认值为0。
●kernel.core_pattern
设置core文件保存位置或文件名,只有文件名时,则保存在应用程序运行的目录下
默认值为core。
●kernel.core_pipe_limit
定义了可以有多少个并发的崩溃程序可以通过管道模式传递给指定的core信息收集程序。
如果超过了指定数,则后续的程序将不会处理,只在内核日志中做记录。
0是个特殊的值,当设置为0时,不限制并行捕捉崩溃的进程,但不会等待用户程序搜集完毕方才回收/proc/pid目录(就是说,崩溃程序的相关信息可能随时被回收,搜集的信息可能不全)。
默认值为0。
●kernel.core_uses_pid
Core文件的文件名是否添加应用程序pid做为扩展:
0表示不添加,1表示添加。
默认值为1。
●kernel.dmesg_restrict
限制哪些用户可以查看syslog日志,0表示不限制,1表示只有特权用户可以查看。
默认值为0。
●kernel.kptr_restrict
是否启用kptr_restrice,此功能为安全性功能,用于屏蔽内核指针。
0:
该特性被完全禁止;
1:
那些使用“%pk”打印出来的内核指针被隐藏(会以一长串0替换掉),除非用户有CAP_SYSLOG权限,并且没有改变他们的UID/GID(防止在撤销权限之前打开的文件泄露指针信息);
2:
所有内核指使用“%pk”打印的都被隐藏。
默认值为0,建议设置为1。
●kernel.modprobe
该文件给出了当系统支持module时完成modprobe功能的程序的名字(包括路径)。
默认值为:
/sbin/modprobe
●kernel.modules_disabled
表示是否禁止内核运行时可加载模块:
0表示不禁止,1表示禁止
默认值为0。
●kernel.msgmax
消息队列中单个消息的最大字节数。
默认值为8192。
●kernel.msgmnb
单个消息队列中允许的最大字节长度(限制单个消息队列中所有消息包含的字节数之和)
默认值为16384。
●kernel.msgmni
系统中同时运行的消息队列的个数。
默认值为3965。
●kernel.numa_balancing
表示是否禁止NUMA自动平衡策略,0表示禁止,1表示不禁止。
默认为0
补充:
numa相关知识
numactl需要安装相应软件包numactl.x86_64
●dmesg|grep-inuma,若有返回值表示CPU支持NUMA
[0.000000]NUMA:
Node0[mem0x00000000-0x0009ffff]+[mem0x00100000-0x0fffffff]->[mem0x00000000-0x0fffffff]
[0.000000]NUMA:
Node0[mem0x00000000-0x0fffffff]+[mem0x10000000-0x7fffffff]->[mem0x00000000-0x7fffffff]
numasta查看具体numa信息
numa_hit是打算在该节点上分配内存,最后从这个节点分配的次数;
num_miss是打算在该节点分配内存,最后却从其他节点分配的次数;
num_foregin是打算在其他节点分配内存,最后却从这个节点分配的次数;
interleave_hit是采用interleave策略最后从该节点分配的次数;
local_node该节点上的进程在该节点上分配的次数
other_node是其他节点进程在该节点上分配的次数
●numactl--hardare查看不同节点的内存总大小,可用大小及nodedistance
建议:
数据库服务器关闭该功能,centos7,vi/etc/grub2.cfg
找到rhgbquiet,在他们后面加上“numa=off”,重启即可。
●kernel.panic
系统发生panic时内核重新引导之前的等待时间,0表示禁止重新引导,>0表示引导前等待几秒。
默认值为0。
●kernel.panic_on_oops
当系统发生oops或BUG时,所采取的措施,0表示继续运行,1表示让klog记录oops的输出,然后panic,若kernel.panic不为0,则等待后重新引导内核。
默认值为1。
●kernel.panic_on_warn
0:
表示只警告,不发生panic,1表示发生panic。
默认值为0。
●perf性能分析工具
kernel.perf_cpu_time_max_percent:
perf分析工具最大能够占用CPU性能的百分比,0表示不限制,1~100表示百分比。
默认值为25。
kernel.perf_event_max_sample_rate:
设置perf_event最大取样速率
默认值:
10000。
kernel.perf_event_mlock_kb:
设置非特权用户允许常驻内存的内存大小。
默认值为516(KB)。
kernel.perf_event_paranoid:
用于限制访问性能计数器的权限。
0表示仅允许访问用户空间的性能计数器;
1表示内核与用户空间的性能计数器都可以访问
2表示仅允许访问特殊的CPU数据
-1表示不限制
默认值为1
●kernel.pid_max
表示当前操作系统PID的最大值
默认值:
131072。
64位操作系统最大值为4194303。
●kernel.pty.max
所分配的PTY的最大值(PTY为虚拟终端,用于远程连接)
默认为4096。
●kernel.pty.nr
当前配置的PTY个数。
该参数为可变参数。
●kernel.pty.reserve
保留的PTY个数,主要分配给系统使用。
默认值为1024。
●kernel.random.boot_id
此文件是个只读文件,包含了一个随机字符串,在系统启动的时候会自动生成这个uuid。
●kernel.random.entropy_avail
此文件是个只读文件,给出了一个有效的熵(4096位)
●kernel.random.poolsize
熵池大小,一般是4096位,可以改成任何大小。
●kernel.random.read_wakeup_threshold
该文件保存熵的长度,该长度用于唤醒因读取/dev/random设备而待机的进程(random设备的读缓冲区长度)
●kernel.random.uuid
此文件是个只读文件,包含了一个随机字符串,在random设备每次被读的时候生成。
●kernel.random.write_wakeup_threshold
该文件保存熵的长度,该长度用于唤醒因写入/dev/random设备而待机的进程(random设备的写缓冲区长度)
●kernel.randomize_va_space
用于设置进程虚拟地址空间的随机化。
0表示关闭进程虚拟地址空间随机化
1表示随机化进程虚拟地址空间中的mmap映射区的初始地址,栈空间的初始地址以及VDSO页的地址
2表示在1的基础上加上堆区的随机化
默认值为2。
●kernel.sched_child_runs_first
设置保证子进程初始化完成后在父进程之前先被调度。
0表示先调度父进程
1表示先调度子进程
默认值为0。
●kernel.sched_latency_ns
表示正在运行进程的所能运行的时间的最大值,即使只有一个处于running状态的进程,运行到这个时间也要重新调度一次(以纳秒为单位,在运行时会自动变化)
同时这个值也是所有可运行进程都运行一次所需的时间,每个CPU的running进程数=sched_latency_ns/sched_min_granularity_ns
●kernel.sched_migration_cost_ns
该变量用来判断一个进程是否还是hot,如果进程的运行时间(now-p->se.exec_start)小于它,那么内核认为它的code还在cache里,所以该进程还是hot,那么在迁移的时候就不会考虑它。
默认值为:
500000。
●kernel.sched_min_granularity_ns
表示一个进程在CPU上运行的最小时间,在此时间内,内核是不会主动挑选其他进程进行调度(以纳秒为单位,在运行时会自动变化)
默认值为:
10000000。
●kernel.sched_nr_migrate
在多CPU情况下进行负载均衡时,一次最多移动多少个进程到另一个CPU上。
默认值为32。
●kernel.sched_rr_timeslice_ms
用来指示roundrobin调度进程的间隔,这个间隔默认是100ms。
默认值为100ms。
●kernel.sched_rt_period_us
●kernel.sched_rt_runtime_us
sched_rt_period与sched_rt_runtime_us一起决定了实时进程在以sched_rt_period为周期的时间内,实时进程最多能够运行的总的时间不能超过sched_rt_runtime_us。
默认值:
kernel.sched_rt_period_us=1000000
kernel.sched_rt_runtime_us=950000
●kernel.sched_tunable_scaling
当内核试图调整sched_min_granularity_ns,sched_latency_ns和sched_wakeup_granularity_ns这三个值的时候所使用的更新方法。
0:
不调整
1:
按照cpu个数以2为底的对数值进行调整
2:
按照cpu的个数进行线性比例的调整
默认值为1。
●kernel.sched_wakeup_granularity_ns
该变量表示进程被唤醒后至少应该运行的时间的基数,它只是用来判断某个进程是否应该抢占当前进程,并不代表它能够执行的最小时间(sysctl_sched_min_granularity),如果这个数值越小,那么发生抢占的概率也就越高。
默认值为:
15000000
●kernel.sem
该变量的四个值分别表示SEMMSL、SEMMNS、SEMOPM、SEMMNI
SEMMSL:
每个信号集的最大信号数量,数据库最大PROCESS实例参数的设置值再加上10,oracle建议将SEMMSL的值设置为不少于100。
SEMMNS:
用于控制整个Linux系统中信号(而不是信号集)的最大数。
Oracle建议将SEMMNS设置为:
系统中每个数据库的PROCESSES实例参数设置值的总和,加上最大PROCESSED值的两倍,最后根据系统中Oracle数据库的数量,每个加10。
使用以下计算方式来确定在Linux系统中可以分配的信号最大数量。
它将是以下两者中较小的一个值:
SEMMNS或SEMMSL*SEMMNI
SEMOPM:
内核参数用于控制每个semop系统调用可以执行的信号操作的数量。
semop系统调用(函数)提供了利用一个semop系统调用完成多项信号操作的功能。
一个信号集能够拥有每个信号集中最大数量的SEMMSL信号,因此建议设置SEMOPM等于SEMMSL。
Oracle建议将SEMOPM的值设置为不少于100。
SEMMNI:
内核参数用于控制整个Linux系统中信号