Archive for February, 2012

Galaxy Note入手体验

February 17th, 2012

特别声明:主观评测,所有评测意见来自本人主观感受,既不权威也不客观。

在被 Moto Milestone 伤了心之后,多年的 moto 用户也将目光投向了三星,关注了 Galaxy Nexus  良久之后,终于入手了 Galaxy Note。

Engaget 的编辑指出“Galaxy Note 是一台不是喜爱到不行就是会饬知以鼻的产品 — 它之于一般智能型手机尺寸的庞大身躯,实际上并不是每个人都可以接受的。“(来源:http://cn.engadget.com/2011/11/02/samsung-galaxy-note-review/ ) 对我来说也是如此,我总觉得这个身材跨界的怪胎会和我的 iPad 的定位发生冲突,所以一直将目光聚焦在略小一点点,有 ICS 的 Galaxy Nexus,怎奈后者的硬件配置实在是平平,最终,在老婆的预算支持下,还是入手了 Galaxy Note。

 物理观感

其实连我自己也不确定,5.3寸的手机是否适合自己的手,不过,到手之后的感觉还是很不错的。手机做得很薄很轻,重量上完全没有挑战,当然,想要舒适的单手操作也不太可能了。

1280×800 的 Super AMOLED 屏,虽然是 pentile 排列的,但看起来还是相当细腻的,这个差不多是前两年 12 寸的笔记本屏的分辨率了吧。不论你是看书、写字、玩游戏,都游刃有余,虚拟键盘的空间也相当宽裕,这个屏幕的体验绝对让你增加很多关注手机的时间。

当然,劣势也在这里,说实话,手握的时间长了还是有些累的,而且⋯⋯我不太敢在人面前拿着这个手机打电话,效果着实有点震撼,所以这几天我一直是在用蓝牙耳机的。

 硬件与系统配置

和两年前的 Milestone 相比,Note 的配置不可同日而语了,让我颇为不适应的事情包括——放了这么多应用之后,还有1.5G剩余,RAM也总是很空,我甚至可以肆无忌惮地在主屏上放好多 Widget,这在原来可是能省则省的啊。各种操作相当流畅,很多原来觉得死慢死慢的东西,比如”图库“,也一下就开了,很不适应啊。

电池方面,昨天晚上试了一下,一宿待机,啥都没关——无线网络、GPS、背景数据传输全开着,睡前还玩了一阵新买的 Sketch Book Mobile 应用,再算上早上端详了半天,掉电大约 10%,我觉得可以接受了,电池问题没有 @colyli 同学说得那么严重,2500mAh 的电池还是相当给力的。

  

当然,电力方面部分得益于新刷的一个 kernel,我第一天到手 root 之后,第二天刷了个 ROM,第三天刷了个 kernel,无愧于 Android 用户的忠实爱好——刷机、重启、换电池。感觉 Samsung 对用户还是很开放的,没有像 milestone 那样恶劣的锁 bootloader 的行为,这才像一个真的 linux 手机嘛。

 应用情况

丢了 iPad 之后,我醒悟到的一点就是 —— iPad 可以吸引用户在丢掉之后立刻就想再买一个的核心价值在于平台上面的体验超棒的优秀应用,特别是那些花钱买来的应用——GoodReader、Keynote、Instapaper 还有很多游戏都在此列,所以,对 Galaxy Note,我的重点也在应用。应用方面,首先说一些兼容性的问题,然后说一点游戏和界面响应的感受,最后说说有啥特别好玩、好用的应用。

实际上很多应用还不能适应5.3寸的屏幕,原来用得好好的 Moji 天气 widget 在 Note 上完全不能看,找了半天找到 Go Weather,还算好用。Pulse 在 Note 上显示时,字也好大啊,调都很难调好,只好删掉了。而且,在 5.3″ 的屏幕上,摆 Widget 也很有难度,为了摆出一个我看着还顺眼的主屏,费了好大力气啊。

对于界面的操控感觉,我觉得在大部分场合都没有什么问题,我装了一些小游戏,比如 Angry Bird, Air Attack, Slice it, Fruit Ninja Free 之类的,都是免费版的,没舍得花钱装收费版本的,呵呵,收费版本的回头到 iPad 上玩吧。都玩了一下,只有 Fruit Ninja 的操控感觉比 iPad 差一些,经常削漏,而且界面似乎被拉扁了,斗胆怀疑是应用本身的适配问题,不过这也在一个侧面说明五花八门的 Android 设备让开发者们有点无所适从。

再来说说一些有意思的应用,对中国用户,要想买付费应用,首先需要root,用 MarketAccess 把自己的手机设为米国或类似地方的服务商的网络代码,才可以访问米国的市场;另外,Android Market 版本太新就无法购买付费应用,所以还要用 OldMarket,替换回老版本的 Market。

有几个应用在原来 Milestone 上就很常用:Switch Pro Widget,用来在界面上安放很多开关的,还有 1-VPN,也是用 Widget 点一下就连 VPN 的,这个比不越狱的 iOS 方便。

Galaxy Note 有自己的 S Pen 和相关应用,点两下就截屏这个很好用,做笔记啥的也很舒服,iPad 要是有这个就好了,呵呵。对于 Galaxy Note 来说,这么大的屏幕,远胜于 iPad 2 的 800万像素摄像头,还有好用的 S Pen,用作笔记和绘图非常方便,Evernote、Skitch 都很好用,还有就是 AutoDesk 的 Sketch Book Mobile 也很好用,这个在 iPad 上也有,界面基本一样,画草图什么的很方便,5.3寸还可以用,太小的屏幕就没什么意思了。当然,这么大屏幕,用来看电子书也是不错的。

  

 

[译文] Flushing out pdflush

February 9th, 2012

按:谨以此译文献给仍然挣扎在 CentOS 5/RHEL 5 上的同学们,RHEL 6/CentOS 6 已经包含这个改进了。

原作者:Goldwyn Rodrigues
原文时间:April 1, 2009
原文链接:http://lwn.net/Articles/326552/
译者:王旭( @gnawux, http://wangxu.me/blog/
翻译时间:2012年2月7-9日

在内核的页缓存(page cache)之中,存放着永久存储设备上的文件内容的内存副本。当程序把数据写入到页面之中,但还没写到磁盘上的时候,这些数据就放在缓存之中,这就是“脏页”。脏页的数量可以从 /proc/meminfo 中看到。每30秒,脏页都会被刷入(flush)磁盘。Pdflush 是一组负责将脏页刷入磁盘的内核线程,它或者是由显式的 sync() 调用出发,或者在页面被清出 page cache 时隐式地自动触发,具体情况包括,如果页面在内存中的时间过长,或者 page cache 中有过多的脏页(过多的界定由 /proc/sys/vm/dirty_ratio 确定)。

在任意给定的时间,系统中会有 2-8 个 pdflush 线程。pdflush 线程的数量由 page chche 的负载确定,如果一秒钟之内,没有空闲的 pdflush线程,但工作队列里还有很多工作要做,就会创建一个新的 pdflush 线程。另一方面,如果最后一个活跃的 pdflush 线程也已经睡了超过1秒了,那就会有一个 pdflush 线程被终止,知道只剩下了两个 pdflush 线程。当前的 pdflush 线程数可以通过 /proc/sys/vm/nr_pdflush_threads 查看。

很久以来,就有很多 pdflush 相关问题让它饱受诟病。Pdflush 线程是所有块设备共享的,但是,如果它们能专注于每一个磁臂的话,性能可能会更好一些。通过 backing_dev_info 结构的 BDI_pdflush 标志,可以避免 pdflush 线程的竞争,但是,互相影响还是会影响写回的性能。Pdflush的另一个问题是请求的饥饿问题。系统的每个队列中都可以有固定个数的I/O请求。如果超过了限制,所有应用的I/O请求都会被阻塞住,直到有新的空位出现。因为 pdflush 是为多个队列工作的,它不会阻塞在某一个队列上。这样,它会设置 wbc->nonblocking 写回信息标志。如果其他应用继续在设备上写入数据,pdflush 就无法分配出空位了。如果 pdflush 不断发现一个队列处于拥塞状态,就会导致这个队列的请求被饿死。

Jens Axboe 在一组 patch 中提出了一个新的方案,使用为每个块设备(backing device info, BDI)配置的 flusher 线程作为 pdflush 的替代品。与 pdflush 不同,BDI 专属的 flusher 线程专注于一个磁臂。在 BDI 刷写的情况下,当请求队列出现拥塞的时候,请求的分配会被阻塞住,避免饿死请求,提供了更好的公平性。

使用 pdflush,脏的 inode list 存储于文件系统的超级块。由于 per-BDI flusher 需要直到知道要写入的脏页属于哪个块设备,所以,这个列表现在存储到了 BDI 里。这样,要刷入一个 superblock 上的所有脏 inode,就会导致刷入这个文件系统占用的所有后端设备上的脏 inode 列表。

与使用 pdflush 时类似,per-BDI 的写回是通过 writeback_control 数据结构控制的,写回程序从中知道写回什么、如何去做。这个结构中的重要字段包括:

  • sync_mode: 定义对于 inode 加锁的情况下,进行同步的方式。如果设置为 WB_SYNC_NONE,写回操作会跳过加锁的 inode,而如果设置为 WB_SYNC_ALL,则会等待加锁的 inode 被 unlock,再进行写回。
  • nr_to_write:要写的页的数量。这个值随着页面被写入而减少。
  • older_than_this:如果不为NULL,所有比这个字段中给出的 jiffies 值老的页面都会被刷入块设备。这个字段会优先于 nr_to_write。

bdi_writeback 结构保存了所有用于刷入脏页的信息:

struct bdi_writeback {
	struct backing_dev_info *bdi;
	unsigned int nr;
	struct task_struct	*task;
	wait_queue_head_t	wait;
	struct list_head	b_dirty;
	struct list_head	b_io;
	struct list_head	b_more_io;

	unsigned long		nr_pages;
	struct super_block	*sb;
};

bdi_writeback结构是在设备使用 bdi_register() 进行注册的时候初始化的。结构的各个字段的含义如下:

  • bdi: 和本结构实例相关联的 backing_device_info,
  • task: 指向缺省flusher线程的指针,这个线程用于启动进行刷写工作的线程,
  • wait: 用于同步flusher线程的等待队列,
  • b_dirty: 本 BDI 上面,需要刷入块设备的所有脏 inode 的 list,
  • b_io: 要进行 I/O 的 inodes ,
  • b_more_io: 更多的要进行 I/O 的 inodes ;所有要刷入的 inode 都先被插入到这个队列中来,之后再移送到 b_io,
  • nr_pages: 要刷入的页的总数,以及
  • sb: 指向当前 BDI 上的文件系统的超级块的指针。

nr_pages 和 sb 是异步传送给 BDI 刷写线程的参数,并且在 bdi_writeback 的生命周期中是可能发生变化的。这是因为有些设备上会有多个文件系统,也就会有多个超级块。当一个设备上有多个超级块的时候,sync 操作可以针对设备上的某一个特定的文件系统。

bdi_writeback_task 函数会周期性发起 wb_do_writeback(wb) 调用,调用周期为 dirty_writeback_interval,缺省值是5秒。如果5分钟内都没有页面被写入,flusher 线程就回退出(计时精度为 dirty_writeback_interval)。(退出)之后如果又需要工作了,那么就会由缺省写回线程来启动一个新的 flusher 线程。

写回的flush有两种工作方式:

  • pdflush方式:由显式的协会请求触发,比如 sync 一个超级块的所有 inode 页面。这时会以超级块的信息和要刷入的页面数量为参数调用 wb_start_writeback()。这个函数会去获取与此 BDI 相关联的 bdi_writeback 结构。如果获取成功的话,会将 superblock 指针和要刷入的页的数量写入 bdi_writeback 结构,并唤醒 flusher 线程,为该超级块进行实际的写操作。这个操作和 pdflush 的写入操作有所不同:pdflush 会根据写的路径来获取设备,阻塞住其他进城的写操作。
  • kupdated 方式:如果没有显式的写回请求,写回线程会周期性地刷入脏数据。当一个 BDI 的一个 inode 的页面第一次变脏的时候,会将 dirtying-time 记入 inode 的地址空间中。当周期性的写回代码检查到这个超级块的 inode 列表的时候,就回写回比某一时间更早变脏的 inode。这一操作的周期是 dirty_writeback_interval,缺省是5秒钟。

第一轮的讨论之后,Jens 根据 Andrew Morton 的建议,添加了每个设备有多个 flusher 线程的支持。Dave Chinner 建议,文件系统可能会希望每个分配组有一个 flusher 线程。在随后的(第二轮)补丁中,Jens 在 superblock 中添加了一个新的接口,来通过一个 inode 获取相关联的 bdi_writeback 结构:

struct bdi_writeback *(*inode_get_wb) (struct inode *);

如果 inode_get_wb 为空,就会返回 BDI 缺省的 bdi_writeback 结构,这就意味着这个 BDI 只有一个 bdi_writeback 线程。每个 BDI 可以启动的最大线程数为 32。

Jens 对一块 SATA 硬盘使用 Flexible File System Benchmark (ffsb) 进行的测试显示,可以获得 8% 的性能提升。通过 vmstat 观察,与未打过补丁的内核相比,文件操作的分布更加平滑 ,缓冲区的写回呈现出均匀分布。而对于一个10块硬盘的 btrfs 文件系统,per-BDI 刷写可以获得 25% 的提速。这组代码位于 Jens 的块设备层 git tree  (git://git.kernel.dk/linux-2.6-block.git)  的 writeback 分支。目前,第二轮讨论还没有新的意见出现,但 per-BDI flusher 线程还不足以进入 2.6.30 内核。

致谢:感谢 Jens Axboe 审阅本文并对这组补丁的一些内容进行了解释。【译文完】

[译文]Ext4新进展:bigalloc, inline data, 和元数据校验和

February 4th, 2012

原文:http://lwn.net/Articles/469805/
原作者:Jonathan Corbet
原文发布时间:November 29, 2011
译者:王旭 ( @gnawux ;  http://wangxu.me/blog/ )
翻译时间:2012年2月3日

ext4是一个刚刚发布一两年的文件系统。不过,这个坚实稳定的系统是基于一个很古老的设计演化而来的。对于一些被作为“下一代文件系统”开发的 FS,比如 btrfs,本文要提到的一些特性可能都已经具备了。然而,btrfs这样的文件系统还需要相当长的时间,才能在更广泛的用户群中获得足够的信心,同时,日益增长的 ext4 用户对这些特性同样心仪已久。近来提交的一些补丁就让我们看到,虽然 ext4 在很久以前就已经进入一个相对稳定的阶段了,但新特性的开发也并未停止。

Bigalloc

在 Linux 早期,磁盘的大小还是MB级的,文件系统的块大小也只是 1KB 到 4KB。而在本文写作的时候,TB级的硬盘虽然在最近涨了一点价,但无碍一个事实——硬盘已经变大太多了,存储在上面的文件也是如此。但 ext4 文件系统仍然以 4KB 为单位来管理数据。其结果就是要管理的块数太多了,相关联的位图大小必然随之增长,管理这些块的开销也就极具增大。

在内核中增加文件系统的块大小会对内存管理、page cache 等产生深远影响,因此是件很恐怖的工作。所以大家都不愿意一下子触及这么多地方,但这并不能阻止文件系统被放在越来越大的磁盘上。在 3.2 内核中,ext4 将可以解决这个问题。“bigalloc”补丁给文件系统引入了一个“块簇(block cluster)”的概念,这样,在一个更大的块组中进行分配时,将一次分配一个块簇而不是一个单独的块。在内核中,这些更大的块和原始的4KB块的映射关系由文件系统负责维护。

簇的大小由管理员在创建文件系统时确定(使用 e2fsprogs 的一个开发版本),不过这个值必须是 2 的整数次幂。在很多情况下,64KB 是个合适的值,对于那些只存放大文件的文件系统,1MB 的簇大小可能是更佳选择。必须指出的是,如果文件系统专用于存放小文件,那么指定一个过大的簇大小回造成很多空间浪费。

使用簇可以减少块位图和其他管理用数据结构的开销。但是,根据 Ted Ts’o 在 7 月份给出的数据。因为这个特性可以降低磁盘的碎片化,对文件IO的性能同样有改进。这个特性预计会成为 3.2 内核(以及 e2fsprogs 1.42)对很多用户的一个杀手级特性。

inline data

inode 是文件系统中用于描述一个文件的数据结构。对于大多数文件系统而言,有两类 inode:文件系统无关的内核数据结构(struct inode),以及文件系统相关的 on-disk 版本。常规地说,如果内核没有一份 inode 的副本的话,就根本无法操作一个文件。所以,本质上说,inode 是很多 block I/O 的关键入口点。

在 ext4 文件系统中,磁盘上的 inode 尺寸可以在文件系统创建时指定,缺省是 256 字节。不过,磁盘数据结构(struct ext4_inode) 只需要大概一般的空间。ext4_inode 结构之后剩下的空间通常用于存储扩展属性。比如 SELinux label 就存放在这里。在没大量使用扩展属性的系统中,磁盘 inode 结构的空余空间就直接浪费掉了。

同时,文件数据的空间分配是以文件系统块为单位的,与 inode 彼此独立。如果一个文件非常小(即使在现在的文件系统中,还是有很多小文件),用于存放这个文件的块就浪费了很多空间。如果文件系统使用了上面提到的块簇,那么浪费的空间还会更多,这里,用户可能就会开始抱怨了。

马涛(@淘伯瑜)同学的 ext4 inline data 补丁将会改变这一局面。这个想法非常简单:很小的数据可以直接存放在 inode 之间的空余空间里,根本无需单独分配数据块。对于使用 256个字节的 inode 的文件系统,全部空余空间将会被用于存放这些小文件。如果文件系统使用更大的 inode,只有一半的剩余空间会用于存储文件,剩下的空间留给后面可能要添加的扩展属性,否则的话,这些扩展属性就不得不存放在 inode 之外了。

涛哥提到,在使用了这个补丁的情况下,用于存放内核源码的空间会减少大约 1%,而 /usr 会减少大约 3%。当启用簇之后,节省的空间应该会更多,但这也不能保证对所有情况都能减少。仍然有些细节问题没有完全完成——包括 e2fsck 支持以及扩展属性存放在 inode 之外带来的开销——所以,这个特性最早要在 3.4 kernel 中才会出现。

元数据校验和

存储设备并不总是像我们期望的那样可靠的,由于硬件原因造成的数据损坏案例屡见不鲜。正因为如此,关心数据安全的人们使用了 RAID 这样的技术,或者像 Btrfs 这样的文件系统可以保存数据和元数据的校验和,以确保内容不被硬件弄丢。不过,ext4 文件系统没有这一能力。

Darrick Wong 的校验和补丁并没有解决全部问题。实际上,它似乎进一步印证了那个老笑话——文件系统开发者并不真的关心他们存储数据的正确性,只要文件系统的元数据没错就行了。这组补丁通过给 ext4 文件系统的各个数据结构加上校验和,包括 superblock、bitmap、inode、dir index、extent tree 等,并在读取时检验校验和,以保证元数据的正确性。校验和失败可能导致文件系统失败,如果这发生在一个挂载着的文件系统上,会把它变为只读,并在系统日志中输出一些相关信息。

Darrick并未提及任何给用户数据添加校验和的计划。给数据添加校验会是一个更宏大的工程——为已有的元数据数据结构添加一个校验字段相对简单,但要存储数据块的校验和就得给文件系统增加全新的数据结构了。而且,全数据校验的性能损失也会更高。所以,尽管未来可能有人会来介入这个问题,但迄今为止还没有这个动向。

即使只是元数据的校验和,对文件系统的改变仍然是很大的,不过相当一部分工作是属于 e2fsprogs 的。特别的,e2fsck 将具有检查元数据校验和的功能,并在某些校验和出错时进行修复。校验和可以在 mke2fs 时打开,或是通过 tune2fs 开启。总的说,这是个很大的工作,但确实可以帮助用户增加对文件系统结构的信心。根据 Darrick 的介绍,计算和检验校验和的开销在大部分情况下是可以忽略不计的。这个特性目前还没有收到很多反馈,或许已经接近被接纳进内核,但还不清楚什么时候会进来。

Switch to our mobile site