最近发现一台测试服务器频繁重启,各种排错找不到原因,
服务器:CentOS6
内核:2.6.32-431.1.2.0.1.el6.x86_64
这里要注意了,引起服务器频繁重启的原因很有可能是内核引起的
随后查找了目前为止有缺陷的内核版本,如下:Centos 6:
2.6.32-220.el6.x86_64
2.6.32-431.el6.x86_64
2.6.32-71.el6.x86_64Centos 7:
3.10.0-229.el7.x86_64
这里说一下,内核升级一定要编译安装的方式升级,请勿使用yum。因为服务器在机房,做内核升级用yum,导致开机起不来的情况时有发生。
问题:
随后用top命令查看服务器负载不高,但是发现用户态占用cpu使用率非常高,16核cpu,经常12个都是100%,但是查看进程并没有cpu占用太高的进程,从右侧上方查看cpu负载也不是很高
如图:
如果是内核态占用率高的话也就好怀疑是内核的问题了,但是内核态看起来一切正常。通过ps aux命令查看所有进程进行逐一排查,并停掉所有在使用的进程,并没有发现异常进程。用户态占用还是奇高。加上此内核在缺陷内核列表内,所以接下来进行内核升级。
升级内核:
官网现在最新稳定版kernel,截至2018.5.28最新稳定版本是4.16.11,因为服务器在国外,所以下载很慢,这里推荐多线程下载器 mwget 命令行多线程下载器,安装也很简单,因为服务器很不稳定,所以我加上了nohup进行后台下载,这里的mwget是指定几个线程同时下载。当然用wget下载也是可以的。mwget只是推荐。
- 下载:
nohup mwget -c0 -n 32 https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.16.11.tar.xz &
然后解压内核:
tar xJf linux-4.16.11.tar.xz -C /usr/src/kernel
环境准备:
yum yum groupinstall "Development Tools" -y
yum -y install openldap openldap-clients openldap-developenldap-servers gcc gcc-c++ glibc automake autoconf libtool makelibmcrypt-devel mhash-devel libxslt-devel libjpeg libjpeg-devel libpnglibpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-develglibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-develcurl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-developenssl openssl-devel hmaccalc binutils-devel elfutils-libelf-devel bc
- 编译安装内核:
cd /usr/src/kernel/linux-4.16.11/
因为已经有老内核,所以用老内核的配置文件,省事。复制老内核配置文件到当前目录下并改名为.config
1. cp /boot/config-2.6.32-431.el6.x86_64 ./.config
接下来本应该运行这个命令:make mrproper && make clean
进行编译但是没安装的文件进行清空,因为我是刚解压过来的,所以就免了。直接下一步。
2. make menuconfig
用这个命令可以对内核模块进行定制,我只改个名其它没有修改。
这里记录一下,这个命令是基于.config进行内核模块的修改。建议没什么特殊需求,直接用改个名字退出就行,退出的时候问你是否保存,当然要保存,也可以先save进行保存。
3. make -j 16
这里说一下,-j 就是指定几个cpu进行编译。我希望快点,所以用了所有cpu,当然 也可以用make all
也不是绝对的,我升级了两个机器,虚拟机正常,但是实体机会报错。
* Error during update of the configuration.
make[2]: * [silentoldconfig] 错误 1
make[1]: * [silentoldconfig] 错误 2
SYSTBL arch/x86/include/generated/asm/syscalls_32.h
SYSHDR arch/x86/include/generated/uapi/asm/unistd_32.h
SYSHDR arch/x86/include/generated/uapi/asm/unistd_64.h
SYSHDR arch/x86/include/generated/uapi/asm/unistd_x32.h
make: * 没有规则可以创建“include/config/kernel.release”需要的目标“include/config/auto.conf”。 停止。
make: * 正在等待未完成的任务….思路就是复制老内核的auto.conf给新内核使用。
cp /usr/src/kernels/2.6.32-431.1.2.0.1.el6.x86_64/include/config/auto.conf /usr/src/kernel/linux-4.16.11/incloud/config/
如果没有config目录,就创建这个目录。然后再进行编译就不报错了。- 编译安装内核:
4. make modules_install
编译安装 .config给定的各种模块
5. make install
进行安装。然后等待安装完毕,如果安装成功,打开/etc/grub.conf。会显示有两个版本的内核,默认启动老内核,更改default默认值,从上往下依次从0开始,保存/etc/grub.conf并重启。
[root@localhost ~]# uname -r
4.16.11dongsi
6.然后就是重启服务器
大功告成,负载也下来了。服务器平稳运行:
下面这个问题好像全网都没解决办法,不少人也遇到了,再贴一下,为了帮助更多人
* Error during update of the configuration.
make[2]: * [silentoldconfig] 错误 1
make[1]: * [silentoldconfig] 错误 2
SYSTBL arch/x86/include/generated/asm/syscalls_32.h
SYSHDR arch/x86/include/generated/uapi/asm/unistd_32.h
SYSHDR arch/x86/include/generated/uapi/asm/unistd_64.h
SYSHDR arch/x86/include/generated/uapi/asm/unistd_x32.h
make: * 没有规则可以创建“include/config/kernel.release”需要的目标“include/config/auto.conf”。 停止。
make: * 正在等待未完成的任务….
思路就是复制老内核的auto.conf给新内核使用。
cp /usr/src/kernels/2.6.32-431.1.2.0.1.el6.x86_64/include/config/auto.conf /usr/src/kernel/linux-4.16.11/incloud/config/
如果没有config目录,就创建这个目录。然后再进行编译就不报错了。