Swap对响应时间敏感应用的影响

最近排查的一个线上应用load高的问题,和GC以及Swap有关系。

现象是机器load突然升高,查看占用CPU的线程发现是JVM自己的线程。

jstat发现一个奇怪的现象,Eden Gen到了100%之后会持续好几秒,但Old Gen没有明显增大,说明并不是Eden Gen不够用promote到Old Gen了,感觉似乎是Young GC出了问题。

进一步查看GC Log,发现一次Young GC要1秒多,正常情况下20~30ms都应该结束了。

然而仔细去看那条log会发现CPU消耗并不高:

[Times: user=0.23 sys=0.00, real=1.31 secs]

多出来的时间如果不在CPU上,那就是耗在了I/O上了,GC的I/O不会在网络上,只能是磁盘了。

free -m看了下,果然Swap的空间快被用满了都。

在排查到最终的内存原因前,先把Swap关掉:

sudo swapoff -a

对于Web应用等对响应时间(rt)非常敏感的系统来说,关闭Swap通常都是一个好的实践。

因为一般来说宁愿应用OOM挂掉也不愿意导致rt飙高,使得应用hang在那里的。

另外建议开启这两个参数:

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=path

帮助你在发生OOM时dump heap,一般这时候的heap dump质量都比较高:)

Linux IO调度器

在现代计算机体系中,机械硬盘仍然作为大部分情况下的存储设备使用,而机械硬盘的访问相对内存差了多个数量级,主要原因在于机械臂转动的寻道时间太长,机械操作没法跟上电子信号的传递,所以OS不可能对每次I/O请求都直接作寻道处理,而是需要额外的工作。

在Linux中,这部分工作主要由I/O调度器完成。 继续阅读

Ubuntu系统的备份和还原

用Windows的时候习惯了ghost备份,但是ghost是不支持ext4分区格式的,所以只能寻找另外的备份方法,幸好Ubuntu本身就给我们提供了良好的备份和还原支持,分以下3步:
(1)备份已安装软件列表

sudo dpkg --get-selections > app-backup-list.txt

将会在你的主目录下生成app-backup-list.txt文件,存储了所有当前系统安装的软件名,供恢复时使用。

(2)备份软件源

cp /etc/apt/sources.list ~

将会把你的软件源文件备份到主目录,若有其它的源文件,请自行备份。

(3)备份用户目录

sudo cp -r ~ [目标目录]

将递归把你的当前用户目录备份到目标目录
继续阅读

唤出ubuntu下ibus的拼音输入法设置

之前一直纠结于ubuntu10.10下ibus-pinyin无法调出设置窗口,导致我的候选项一直只有5个:(,安装sunpinyin后也是如此,看到 @yongsun 的说法,ubuntu从不知哪个版本开始默认就不显示输入法框(panel)了,不知道是谁想出了这么无语的设计。

解决方案如下:

进入 系统——>首选项——>键盘输入法(ibus deamon),在“显示语言栏”中选择“活动时”。这时再切换拼音输入法,熟悉的panel就在右下角候着你了:)

U盘安装Ubuntu

Ubuntu 10.10如期而至,考虑到环保和方便等因素,我安装操作系统一向都是从U盘启动安装。这次早早地下载完毕后却发现将其刻录到U盘之后,U盘启动加载SYSLINUX时就停止下来,Google一下,许多用户都出现了这个问题,查询ubuntu.com发现有人提交该issue,证实是个bug。

经过研究解决方案如下:

找到U盘根目录下Syslinux/Syslinux.cfg文件,找到下面这行:

default vesamenu.c32

在之前加上’#’符号,注释掉该菜单,更改后该行为:

#default vesamenu.c32

保存修改后重启采用U盘启动,这时将可以直接进入LiveCD环境,这时再从桌面安装Ubuntu 10.10即可。

感觉Ubuntu 10.10的安装比之前的版本更为人性化和傻瓜化,安装速度也有大幅提高。

更改Ubuntu与Windows双系统启动菜单(Grub)

相信有些朋友和我一样在机器上装了Linux和Windows双系统,由于尚未完全转到Linux平台,很多工作仍需在Windows下完成,但是每次系统菜单的选项默认都为Linux,同时每次更新Linux内核以后,就会在启动菜单中添加新的内核选项,很是烦人。上网搜了一下,发现更改启动菜单不是很难,总结如下,希望能给需要的人一些帮助。

我的Linux发行版是Ubuntu 10.04。

首先进入Ubuntu,运行Application——>Terminal,输入命令:

sudo gedit /boot/grub/grub.cfg

输入密码后回车,打开grub的配置文件。 继续阅读