一、安装centos开机出现Kernel panic - not syncing: Attempted to kill init无法启动的解决方法
装系统总会遇到各种新鲜问题,不过不要紧,只问题才能提升解决问题的能力,今天重新装了个CENTOS6.5的64位版,可能是进行了分区(boot单独挂载到了一个分区),开机时centos报错:Kernel panic - not syncing: Attempted to kill init,截图如下:
网上找了找,也有人遇到了同样的问题并提供了临时地解决办法,即启动后按e键进入grub引导界面如下:在此界面下选中第二个,按e键进入编辑模式(下方红框中列出了可用的快捷键及意义)。
在这行最后面添加一个: enforcing=0,这行我就没截图了,输入后按“enter"确定,然后根据上面的提示按b键继续boot.此时就能进入centos。但这样还是有个问题,就是当你重启后你会发现又会碰到同样的问题,依然要进行一样的修改,那有没有办法让这个enforcing=0永久加上呢。当然是可以的。在成功进入centos之后,我们可以对centos的grub引导菜单进行编辑,
命令:vi /boot/grub/menu.lst 里面列出的就是上图引导菜单的各项,如下图,这时我们就可以对其进行编辑,加上enforcing=0这项配置,保存再次重启就会自动成功了。
命令执行过程如下:
[root@localhost ~]# cat /boot/grub/menu.lst
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/sda2
# initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.32-431.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=f6cf5f2e-c216-4dbf-88dd-ea8169bbc2b1 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet enforcing=0
initrd /initramfs-2.6.32-431.el6.x86_64.img
[root@localhost ~]#
二、linux服务器内存一直在减少-Cached占用很大的原因和解决
最近在进行项目压测,并发压力8000,在测试的过程中发现内存一直在减少,开始也没觉得是大问题,但是压力测试进行几天之后,再看内存,15G内存的服务器只剩下100来M了。但此时服务器并没有崩溃,统计来看内存减少至约160M时会自动释放一些,但不会释放很多(基本不超过180)。见下图:
可见linux服务器会自动释放内存,保障系统运行,但只会释放够用的内存,而不会去释放更多的内存,现在的问题有1.是什么东西占了这么多内存?查看进程根本没有几个进程占用多少内存。2.linux内存释放时也不释放这些内存是为什么?3.为什么减至160M后才开始释放?
使用命令:cat /proc/meminfo 查看内存占用情况时发现内存占用很大时,是Cached值非常大,基本快接近总内存值15G了。
(上图是问题解决后的图,此时Cached已经释放)
cached是什么?cached是作为page cache的内存, 文件系统的cache。主要负责缓存文件使用, 日志文件过大造成cached区内存增大把内存占用完,如果 cache 的值很大,说明cache住的文件占用很大。可我服务器上的程序里基本没有对磁盘进行读写操作,为什么会这么大呢?这时才突然想起来nginx的访问日志,因为是写到一个access.log里,这个文件一直在增加,且nginx每次请求都会写入,是极有可能是这个问题。于是我对nginx日志的文件进行清空:echo > access.log。在执行此操作前后对比发现内存被释放了,基本Cached完全释放出来(最终我通过将nginx日志分时处理解决了这个内存问题)。
在前面一篇文章里:http://47.93.183.36/article/141.html 我通过手动释放,将内存释放出来了,实际也是释放的Cached,这是Linux内核的策略:最大程度的利用内存cache 文件系统的数据,以提高IO速度。所以可以是因为nginx一直要写这个access.log.而这个文件可能在压测几天后慢慢地超过了内存的大小,使得它快占用完整个内存。而在linux服务器自动释放内存时又会尽量不释放Cached这块内存,使得内存越来越小。所以内存一直在减少-Cached占用很大时可以排查一下有没有很大很多的文件在读写,
可以配置系统 开始回收内存的阀值:/proc/sys/vm/min_free_kbytes。通过查看我服务器配置的是:67584 。约66M,但不知为何通过测试发现我这里是到160M左右就开始释放的。先放着也许哪天就顺手解决了。