一、内核升级
1、升级内核
使用 yum 等包管理系统和官方支持的仓库升级内核的方法,但是,这只会升级内核到仓库中可用的最新版本 - 而不是在 https://www.kernel.org/ 中可用的最新版本。不幸的是,Red Hat 只允许使用前者升级内核。与 Red Hat 不同,CentOS 允许使用 ELRepo,这是一个第三方仓库,可以将内核升级到最新版本。ELRepo 仓库是基于社区的用于企业级 Linux 仓库,提供对 RedHat Enterprise (RHEL) 和 其他基于 RHEL的 Linux 发行版(CentOS、Scientific、Fedora 等)的支持。ELRepo 聚焦于和硬件相关的软件包,包括文件系统驱动、显卡驱动、网络驱动、声卡驱动和摄像头驱动等。要在 CentOS 7 上启用 ELRepo 仓库,请运行:
#导入ELRepo仓库的公共密钥 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org #安装ELRepo仓库的yum源 rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
2、查看可用的系统内核包
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
3、安装最新版本内核
长期维护版本为 lt ,最新主线稳定版 ml
可以自己到网站下载对应版本,然后指定版本安装,https://buildlogs.centos.org/c7-kernels.x86_64/kernel/
#--enablerepo 选项开启 CentOS 系统上的指定仓库。默认开启的是 elrepo,这里用 elrepo-kernel 替换。 yum -y --enablerepo=elrepo-kernel install kernel-ml
4、设置 GRUB 默认的内核版本
内核安装好后,需要设置为默认启动选项并重启后才会生效
查看系统上的所有可用内核:
# sudo awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
设置新的内核为grub2的默认版本
通过 grub2-set-default 0 命令或编辑 /etc/default/grub 文件来设置
#设置 GRUB_DEFAULT=0。意思是 GRUB 初始化页面的第一个内核将作为默认内核 grub2-set-default 0
生成 grub 配置文件并重启
#接下来运行下面的命令来重新创建内核配置 # grub2-mkconfig -o /boot/grub2/grub.cfg
5、制作离线内核升级包
# 下载制作升级包的工具 yum -y install yum-utils yum -y install createrepo -y repotrack httpd -p ./httpds/ 或者 yumdownloader --resolve --destdir /tmp/ansible ansible # 制作最新版本的内核软件包,保存在了./kernel-ml.x86_64/目录 repotrack kernel-ml.x86_64 -p ./kernel-ml.x86_64/ 或者 yumdownloader --resolve --destdir ./kernel-ml.x86_64 kernel-ml.x86_64 # 制作好了之后只需要把kernel-ml.x86_64目录拷贝到需要升级的机器升级即可
离线升级centos7内核
内核下载大全
http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/
在一台可以上网的机器上面执行如下命令获取离线安装包
wget https://www.elrepo.org/RPM-GPG-KEY-elrepo.org rpm --import RPM-GPG-KEY-elrepo.org wget http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm rpm -Uvh elrepo-release-7.0-2.el7.elrepo.noarch.rpm # 将包kernel-ml-5.8.1-1.el7.elrepo.x86_64.rpm下载到/data/soft目录下 yum install --enablerepo=elrepo-kernel --downloadonly --downloaddir=/data/soft/ kernel-ml
将kernel-ml-5.8.1-1.el7.elrepo.x86_64.rpm 上传到想升级内核的机器
设置 GRUB 默认的内核版本
了让新安装的内核成为默认启动选项,你需要如下修改 GRUB 配置,打开并编辑 /etc/default/grub 并设置 GRUB_DEFAULT=0.意思是 GRUB 初始化页面的第一个内核将作为默认内核.
设置:
将GRUB_DEFAULT=saved注释 改为 GRUB_DEFAULT=0
重新创建内核配置
grub2-mkconfig -o /boot/grub2/grub.cfg
删除旧内核的 RPM 包(慎重操作!!!!)
# yum remove kernel-3.10.0-514.el7.x86_64 \ kernel-tools-libs-3.10.0-862.11.6.el7.x86_64 \ kernel-tools-3.10.0-862.11.6.el7.x86_64 \ kernel-3.10.0-862.11.6.el7.x86_64
二、优化
1、Core文件简介
Core文件其实就是内存的映像,当程序崩溃时,存储内存的相应信息,主用用于对程序进行调试。当程序崩溃时便会产生core文件,其实准确的应该说是core dump 文件,默认生成位置与可执行程序位于同一目录下,文件名为core.***,其中***是某一数字。
2、什么是Core Dump:
我们在开发(或使用)一个程序时,最怕的就是程序莫明其妙地当掉。虽然系统没事,但我们下次仍可能遇到相同的问题。于是这时操作系统就会把程序当掉
时的内存内容 dump 出来(现在通常是写在一个叫 core 的 file 里面),让 我们或是 debugger 做为参考。这个动作就叫作
core dump。
一般的发行版,限制单进程最大可以打开1024个文件,这是远远不能满足高并发需求的,调整过程如下:
# ulimit –n 65535
将root启动的单一进程的最大可以打开的文件数设置为65535个。
# vim /etc/security/limits.conf * hard core 0 表示对所有用户生产dump,但默认是注释了的 如果只想对某些用户或用户组打开core dump * soft nofile 65535 单个进程可打开的文件描述符的最大数(超过会警告) * hard nofile 65535 单个进程可打开的文件描述符的最大数(超过会报错) * soft nproc 单个用户可用的最大进程数量(超过会警告); * hard nproc 单个用户可用的最大进程数量(超过会报错); 其中'*'号表示修改所有用户的限制;
用户打开的进程数
$ ps h -Led -o user | sort | uniq -c | sort -n
1 chrony
1 dbus
1 dhcpd
1 privoxy
1 rpc
1 rpcuser
2 postfix
5 apache
11 op_admin
3、内核优化
vim /etc/sysctl.conf
(这个目录主要是配置一些系统信息,而且它的内容全部是对应于/proc/sys/这个目录的子目录及文件。)
net.ipv4.conf.all.forwarding = 0 net.ipv4.conf.all.log_martians = 1 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.default.log_martians = 1 net.ipv4.tcp_timestamps = 0 net.ipv6.conf.all.accept_redirects = 0 net.ipv6.conf.default.accept_redirects = 0 net.ipv4.ip_forward=1 kernel.core_uses_pid = 0 可以控制产生的core文件的文件名中是否添加pid作为扩展,如果添加则文件内容为1,否则为0 kernel.core_pattern = core 该参数就是可以设定core dump文件的文件名及路径,以及可以利用管道将结果输入给管道右边的程序进行处理。 fs.suid_dumpable = 0 net.ipv4.tcp_fin_timeout = 2 #保持在FIN-WAIT-2状态的时间,使系统可以处理更多的连接。此参数值为整数,单位为秒。 net.ipv4.tcp_tw_reuse = 1 #开启重用,允许将TIME_WAIT socket用于新的TCP连接。默认为0,表示关闭。 net.ipv4.tcp_tw_recycle = 1 #开启TCP连接中TIME_WAIT socket的快速回收。默认值为0,表示关闭。 net.ipv4.tcp_syncookies = 1 #开启SYN cookie,出现SYN等待队列溢出时启用cookie处理,防范少量的SYN攻击。默认为0,表示关闭。 net.ipv4.tcp_keepalive_time = 600 #keepalived启用时TCP发送keepalived消息的拼度。默认位2小时。 net.ipv4.tcp_keepalive_probes = 5 #TCP发送keepalive探测以确定该连接已经断开的次数。根据情形也可以适当地缩短此值。 net.ipv4.tcp_keepalive_intvl = 15 #探测消息发送的频率,乘以tcp_keepalive_probes就得到对于从开始探测以来没有响应的连接杀除的时间。默认值为75秒,也就是没有活动的连接将在大约11分钟以后将被丢弃。对于普通应用来说,这个值有一些偏大,可以根据需要改小.特别是web类服务器需要改小该值。 net.ipv4.ip_local_port_range = 1024 65000 #指定外部连接的端口范围。默认值为32768 61000。 net.ipv4.tcp_max_syn_backlog = 262144 #表示SYN队列的长度,预设为1024,这里设置队列长度为262 144,以容纳更多的等待连接。 net.ipv4.tcp_max_tw_buckets =5000 #系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数值将立刻被清楚并输出警告信息。默认值为180000。对于squid来说效果不是很大,但可以控制TIME_WAIT套接字最大值,避免squid服务器被拖死。 net.ipv4.tcp_syn_retries = 1 #表示在内核放弃建立连接之前发送SYN包的数量。 net.ipv4.tcp_synack_retries = 1 #设置内核放弃连接之前发送SYN+ACK包的数量。 net.core.somaxconn = 16384 #定义了系统中每一个端口最大的监听队列的长度, 对于一个经常处理新连接的高负载 web服务环境来说,默认值为128,偏小。 net.core.netdev_max_backlog = 16384 #表示当在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包的最大数量。 net.ipv4.tcp_max_orphans = 16384 #表示系统中最多有多少TCP套接字不被关联到任何一个用户文件句柄上。如果超过这里设置的数字,连接就会复位并输出警告信息。这个限制仅仅是为了防止简单的DoS攻击。此值不能太小。
1、其实每个'.'分割的就代表一个目录,例如,fs.file-max也就代表/proc/sys/fs/file-max。那么/proc/sys/是用来做什么的呢?大家都知道/proc是每次系统启动的时候都要重新挂载的,它反映了系统内存里面的一些状态。通过/proc/可以很好的了解到当前系统的一些信息。而/proc/sys/则是这些信息的一小部分而已。
2、sysctl -p #生效
-w 临时改变某个指定参数的值,如
sysctl -w net.ipv4.ip_forward=1
如果仅仅是想临时改变某个系统参数的值,可以用两种方法来实现,例如想启用IP路由转发功能
1) #echo 1 > /proc/sys/net/ipv4/ip_forward
2) #sysctl -w net.ipv4.ip_forward=1
4、centos 7 系统从/usr/lib/sysctl.d/*.conf 和 /etc/sysctl.d/*.conf 加载应用系统配置,加载顺序根据*.conf的文件名确定
手动加载所有的配置文件,执行:
# sysctl --system
单独指定配置文件加载,执行:
# sysctl -p filename.conf
也可以直接通过sysctl工具配置值,执行:
# sysctl kernel.sysrq=1 (效果等同:# echo "1" > /proc/sys/kernel/sysrq)
ulimit -c unlimited echo 1 > /proc/sys/kernel/core_uses_pid echo "/tmp/core-%e-%s-%u-%g-%p-%t" > /proc/sys/kernel/core_pattern echo 2 > /proc/sys/fs/suid_dumpable
6、在Bash中有个ulimit命令,提供了对Shell及该Shell启动的进程的可用资源控制。
主要包括打开文件描述符数量、用户的最大进程数量、coredump文件的大小等。
在CentOS 5/6等版本中,资源限制的配置可以在/etc/security/limits.conf设置,针对root/user等各个用户或者*代表所有用户来设置。
当然,/etc/security/limits.d/ 中可以配置,系统是先加载limits.conf然后按照英文字母顺序加载limits.d目录下的配置文件,后加载配置覆盖之前的配置。
不过,在CentOS 7/RHEL 7的系统中,使用Systemd替代了之前的SysV,因此/etc/security/limits.conf 文件的配置作用域缩小了一些。
limits.conf这里的配置,只适用于通过PAM认证登录用户的资源限制,它对systemd的service的资源限制不生效。登录用户的限制,与上面讲的一样,通过/etc/security/limits.conf和 limits.d来配
置即可。
PAM模块全称是Pluggable Authentication Module for linux(可插入式授权管理模块),该由Sun公司提供,在Linux中,PAM是可动态配置的,本地系统管理员可以自由选择应用程序如何对用户进行身份验证。PAM应用在许多程序与服务上,比如登录程序(login、su)的PAM身份验证(口令认证、限制登录),passwd强制密码,用户进程实时管理,向用户分配系统资源等
对于systemd service的资源限制,如何配置呢?
全局的配置,放在文件/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用户实例使用的。一般的sevice,使用system.conf中的配置即可。systemd.conf.d/*.conf中配置会覆盖system.conf。
DefaultLimitCORE=infinity DefaultLimitNOFILE=100000 DefaultLimitNPROC=100000
注意:修改了system.conf后,需要重启系统才会生效。
针对单个Service,也可以设置,以nginx为例。
编辑/usr/lib/systemd/system/nginx.service文件,或者/usr/lib/systemd/system/nginx.service.d/my-limit.conf文件,做如下配置:、
[Service] LimitCORE=infinity LimitNOFILE=100000 LimitNPROC=100000
然后运行如下命令,才能生效。
sudo systemctl daemon-reload sudo systemctl restart nginx.service
查看一个进程的limit设置:cat /proc/YOUR-PID/limits
例如
$ cat /proc/$(cat /var/run/nginx.pid)/limits Limit Soft Limit Hard Limit Units Max cpu time unlimited unlimited seconds Max file size unlimited unlimited bytes Max data size unlimited unlimited bytes Max stack size 8388608 unlimited bytes Max core file size unlimited unlimited bytes Max resident set unlimited unlimited bytes Max processes 100000 100000 processes Max open files 100000 100000 files Max locked memory 65536 65536 bytes Max address space unlimited unlimited bytes Max file locks unlimited unlimited locks Max pending signals 1030606 1030606 signals Max msgqueue size 819200 819200 bytes Max nice priority 0 0 Max realtime priority 0 0 Max realtime timeout unlimited unlimited us
CentOS7自带的/etc/security/limits.d/20-nproc.conf文件里面默认设置了非root用户的最大进程数为4096
在limits.conf中设置会被limit.d目录中的配置覆盖了。
cat /etc/security/limits.d/20-nproc.conf * soft nproc 4096 root soft nproc unlimited
https://blog.csdn.net/xinmeiwan/article/details/52934943 Core Dump详解
https://mp.weixin.qq.com/s/1xRc4DzyG4c8e2XYGk28Vg