一、内核升级

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 #生效

             -p   从指定的文件加载系统参数,如不指定即从/etc/sysctl.conf中加载

             -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)

5、coredump文件抓取设置

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

https://www.cnblogs.com/xiaodoujiaohome/p/6222895.html    Core文件作用、设置及用法

相关文章: