选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……
今天听 Doug White 大牛说有这个功能,于是查了一下资料,先记一笔,不一定对,有机会找机器测试一下。
首先要定义SCSI/SAS总线所在的位置。通常它是由某个SCSI接口卡提供的,也就是类似这样:
hint.scbus.0.at=“mpt0”
这表示 scbus0 是 mpt0。如果一块卡支持多个 SCSI 总线,则还应额外指定 bus 参数。
接下来是每块硬盘的位置。SCSI/SAS设备可以由3个参数来唯一定位:总线、目标(target)和单元(LUN)。例如总线0、目标0、单元0上的设备应该叫做da0,则配置如下:
hint.da.0.at=“scbus0”
hint.da.0.target=“0”
hint.da.0.unit=“0”
可以使用简单的awk或python甚至shell来成批生成。这种定位方式与Solaris的c0t0d0类似,但用户可以自己指定名字(配置 devd.conf 应该可以更进一步创建设备对应的 c0t0d0 这样的符号连接,改天再看看)。配好之后写到 /boot/device.hints 就好。
Read more...做反垃圾邮件的人应该感谢发垃圾邮件的人吗?
当然不。
今天在推上有人说反垃圾邮件的人应该感谢发垃圾邮件的人,很显然这是斯德哥尔摩综合症。
从微观角度说,给做反垃圾邮件的人发钱的人,是那些不喜欢垃圾邮件的人,要感谢,应该感谢给钱的人。这个世界上比反垃圾邮件有意思的事情有很多,不做这个可以做别的。
从宏观角度说,发垃圾邮件不创造价值,相反它增加了很多人的成本。如果没有垃圾邮件,你本可以做更多能够创造价值的、更有意思的事情,赚更多的钱。
凭什么要感谢那些搞破坏的人?
我还是那句话,发垃圾邮件的人,留神生小孩没屁股眼。
Read more...On Python 2.6 we have a new ‘hashlib’ module, which superseded older ‘md5’ ‘sha1’ modules.
Therefore, importing ‘md5’ would give the following warnings:
DeprecationWarning: the md5 module is deprecated; use hashlib instead
This is quite annoying if you run PlanetPlanet in a cron(8) job and receive e-mail reports. In order to solve that, we can do some simple sed(1) replace over PlanetPlanet’s __init__.py:
s/import md5/import hashlib/g
s/md5\.new/hashlib.md5/g
That’s it! And PlanetPlanet will now happily work with Python 2.6.
Read more...今天是万圣节,下午去了一趟 Costco Wholesale,在它的一小时照片快印处发现了一个供认取阅的版权需知,基本上这个小条告诉我们:
照片的版权无论是否有宣示,均归拍照者所有。(个人猜测这应该是伯尔尼公约的延续)。
复制和打印照片需要获得拍照者的书面许可,否则违法;是否违法与是否故意复制无关,也与是否知道有这么条法律无关;如果是托人打印照片(例如,在 Costco 提供的这种照片冲印服务),那么顾客和 Costco 都有可能需要承担相关的法律后果。
还有就是,比如说请摄影师拍的照片,然后买的包含照片的DVD之类的介质,仍然是不包括打印和复制之类的授权的。
因此,Costco在冲印照片或者刻盘的时候需要由照片作者出具书面的Release Form允许他们这样做。
Read more...这是一个很有意思的话题:随着计算机技术的发展,客户端的计算能力越来越强。想要提高在服务器端运行的系统的负载能力,最直接有效的办法就是把计算任务尽可能交给客户端去做,并减少两者之间的交互;然而,另一方面,这样做又可能会带来一些其他问题,例如,客户端完成某些计算任务的时候可能会比较慢(因为在客户端可以用到的资源比较少,想要保持兼容性最好的办法就是只使用普适的Java Script子集),或者,作为安全系统的一个最基本的原则,任何来自外界的数据都是不应被信任的,等等。
我们可以把数据根据一些规则来进行分类。一般来说数据会具有一些这样的属性:
这样一来,判断计算是否应在客户端进行就比较简单了:我们首先要看的第一个问题是:放在客户端进行,是否会增加服务器的计算量?例如,服务器是否需要再增加一些额外的步骤,才能够完成具体的操作?这些额外的步骤与原先的计算相比是否更少?通常来说,这个答案都是"是的",这样我们可以继续考察第二个问题。
第二个问题是,这样做是否有助于减少通讯量?例如,对于用户输入信息的合法性检查,比如说,用户输入的内容是否可能导致SQL注入,或者,他是否在一个该输入数字的地方输入了其他字符?这些检查很显然必须在服务器端做(因为数据跨越了安全边界),但是,假如客户端也进行了这些检查的话,那么那些无效输入就可以在与服务器交互之前被拦住,从而减少通讯量并减少服务器的负担。
第三个问题是,这样做是否会占用太多客户端资源?这个问题可能不太容易评估,一般来说,计算密集型的任务使用Java Script去做的效果有可能会不太好,有时,为了改善响应时间,有可能会希望这些操作由服务器去完成(由于可以采用任意的软件,因此服务器完成某些任务可能更高效)。简单的排序操作在客户端做有助于减少服务器负载,但如果很多客户端需要请求同样的内容,那么将排序结果在服务器端直接缓存起来就会更好一些,等等。
以上仅代表个人经验供参考。
Read more...无内容。
Read more...看文档的时候,最恶心的事情就是明明那不是一份作弊条文档,却只罗列作者是怎么把一件事做起来的,譬如说列出命令行选项,但是不说这些选项是干什么的,以及为什么选上这些选项。
一篇不说是作弊条,却又写成作弊条的文档,特别是,假如这张据说是课后辅导书,结果实际上是作弊条的东西还有错(常有的事),就太让人郁闷了。
Read more...最近几天测试了一下盘很多(具体说是24块盘,其中2块热备的JBOD)的时候ZFS的性能特点。一些结论
a) ZFS的随机读性能比较差(相对于顺序读写)。这一点除了改为用mirror而不是raidz1/z2之外似乎没什么太好的办法。同样多的硬盘做成两组raidz1(11+11+2),与做成两块盘一组的11组mirror的pool相比,针对同样的数据集的随机读性能相差可达10倍多,当然,mirror的结果是顺序写性能会差一些。作为副作用,mirror时的读性能可提高大约4倍左右。
b) 告诉ZFS数据集常用的数据块尺寸可以提高读写混合的操作的性能。例如如果应用程序多数时间都在操作16K的数据块,将块尺寸改为16K(默认为128K)可将混合操作的性能提高十几倍。
暂时还没测试SSD做ZIL/cache对性能的具体影响,先记下一笔。现在看来如果给数据库用的话,比较好的配置应该是若干对mirror+热备组成zpool,然后把具体存放数据库的zfs的recordsize设置为16k,改天拿实际的数据库在上面跑跑看。
Read more...前一段日子,偶然又看了几集 千王之王重出江湖。其中有一集说到了沈胜天和龙四的决裂,两个人各执己见最后断绝师徒关系。
原则是什么?原则是一个人判断事情的准则,或者说价值观,但又不完全是。我想,还需要再加上一条:不会轻易改变。没有原则的人,要么对于事情的是非没有观念,要么对于是非的判断会经常发生变化,和这样的人长期合作会比较危险。
Read more...DMA (Direct Memory Access) 是一种提高计算机系统并发能力的技术。简单地说,它允许外围设备以异步方式操作内存,从而减少了CPU在I/O操作中的参与。
目前的微机和PC服务器都广泛采用了 DMA 技术。由于 DMA 是一种异步操作,因此在撰写驱动时,有很多需要注意的问题。
第一类比较常见的问题是,并不是所有的 DMA 控制器或设备都有能力访问全部物理内存,或对访问有限制。例如,许多低端存储设备和网卡往往只能访问物理内存的前4GB,甚至更小的范围。而另一些设备可能只能同时访问同一段整4GB内存,例如,它可能只能访问物理地址为 0~4G-1,或4G~8G-1的内存,而不能同时访问两部分内存。还有一种比较常见的限制是设备只能按照整数次方幂边界来访问内存,例如它可能要求映射长度为4K的DMA起始地址为4K的整数倍,等等。
这一类问题比较隐蔽。如果驱动程序没有考虑这些问题,导致的结果往往是在运行一段时间之后突然发现数据损坏等问题。如果硬件手册中没有特别指出硬件的限制,我们往往可以通过设计一些特别的用例来强制系统映射位于某些可能导致问题的边缘内存来发现这类问题。
针对这些限制,操作系统往往提供了一些绕过限制的方法,例如比较常见的bouncing page,即在较低的物理内存地址进行DMA映射,然后由OS在DMA完成之后将这些数据复制到其他地方。这些方法都会导致性能下降,因此,对于希望承担高性能任务的系统而言,应尽量避免使用这样的硬件。
第二类比较常见的问题是,驱动程序(CPU)在不适当的时候读写内存。许多设备都支持主动发起DMA(Bus Mastering),这种时候,CPU可能没有办法知道设备是不是正在写内存。解决这种问题的方法是引入内存栅(Memory Barrier),即驱动程序在读写内存前后通知硬件自己将要执行的操作,并由硬件来确保相应的结果。例如,网卡驱动在读写映射环或映射链的时候,应在读前以及写前后分别进行内存栅操作,确保自己没有读到过期数据,并确保设备没有读到过期数据。
这一类问题也非常隐蔽。对于负载不高的情形,很可能驱动程序的开发者不会注意到任何问题。甚至,对于负载较高的情形,这类问题会表现为响应慢而不是不稳定或数据损坏。
Read more...