选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……
今天 BAFUG 活动, Luigi Rizzo (十年前提出DEVICE_POLLING概念的那哥们) 带来了他在 FreeBSD 上新实作的 netmap。
简单来说 netmap 实际上是提供了一种让用户程序以一致的接口直接访问网卡(收发包且zero copy)的方法。Luigi Rizzo 的测试中,用以 1050MHz 的单核,在很普通的万兆网卡上就可以轻松达到 14.8 Mpps 了,每个包的开销大约是90个时钟周期。
netmap 对网卡的驱动需要做少量修改,但基本都在30行以内。系统仍然可以"看到"用于netmap的网卡,这个接口暂时还不支持 kqueue(不过貌似暂时也没太大必要的说,毕竟一台机器不会有几千块网卡)。除了性能之外,netmap的设计还可以确保内核永远不崩,此外,现有的 libpcap 程序可以很容易地移植到 netmap 平台(取了一个路由平台做例子,使用 libpcap 兼容库可达到大约 70% 左右的 native API 性能;直接用 native API 的话,性能大约是经过优化的普通 libpcap+内核模块 的 Linux 环境的 4 倍)。
现在我自己想到的比较有用的用途是在用户态跑一个 TCP/IP 栈一类的应用—-当然,应用程序可以跟这个 TCP 栈捆在一起。到会的 C记,J记 以及某测试公司的同学提出了不少问题,其中关于 netmap 需要复制哪些内存,这个东西对他们的业务来来说,用途会更直接一些。
这个暂时还没进 -CURRENT。立刻可以想到的改进包括尽量省掉对页表的改动。应用方面似乎可以给 nginx 啥的直接做个 TCP 栈之类的?省掉了 socket 需要的开销,TCP方面可以做的事情就很多了,比如两台机器可以互相推 TCP 状态之类的来做 HA,等等。
Read more...之前一直没什么概念,今天看了微软的 KB 321169 的解释,大致如此:
不过感觉这个解释依然不是很有说服力—-文档上说,SMB服务器端是需要对 NT_TRANSACT_NOTIFY_CHANGE 给出回应的,那么这种情况下ACK不就回应回来了吗?或者说,只要收到了 ACK 就说明服务器端已经处理了这条 SMB?哪位帮忙理解一下?
Read more...Ruby 从下一个版本,也就是 1.9.3 开始,从原先的 GPLv2 许可证换成了 2-clause BSD 许可证(大体上相当于 MIT 许可证)。
早期 Ruby 采用的是自由软件基金会推荐的 GPLv2 or later 许可证方式。在实际操作中这种许可方式十分常见,这种许可证方式包含两层意思:
这其中 (*) 的部分实际上是开给自由软件基金会的一张空白支票,并且可能导致各式各样的法律问题。据我个人的了解,湾区企业的法务部门通常不允许公司以这种方式发布软件,因而,商业公司在使用 GPLv2 or later 许可证的软件时,通常会在发布代码的同时明确说明自己在使用这个软件时只遵循某个特定版本的GPL,以规避潜在的法律风险:
/*
* [company] elects to have and use the contents of [filename] under and governed
* by the GNU General Public License (GPL) Version 2, only. However, the following
* notice accompanied the original version of this file:
*/
然而,实际上这样使用代码也是有风险的。例如,如此这家厂商便无法同时使用 GPLv3 许可证的代码。因为GPLv2 中规定:
Read more...最近改一个用到 OpenSSL 的程序,顺手用 valgrind 抓了一下,发现很多"Conditional jump or move depends on uninitialised value(s)“的错误。发现 OpenSSL 的 FAQ 提到,在生成随机数时会将输入缓冲区(未初始化)的内容直接混入 entropy pool,使用 valgrind 时便会导致警告。
如果这种警告对调试产生困扰,则可以定义 PURIFY 来消除(从代码来看,PURIFY一共影响三处代码:crypto/rand/md_rand.c中,定义PURIFY会去掉将未初始化缓冲区作为输入参数追加到摘要中的过程;crypto/rand/randfile.c中一处在定义了 PURIFY 时会对 stat(2) 结构先进行清零初始化【这个对 FreeBSD 不是问题,FreeBSD的 stat(2) 覆盖整个返回缓冲区】,另一处则是不用缓冲区中未初始化的部分参与摘要追加。
理论上,定义了PURIFY会降低随机数生成过程的随机性,但会消除事先通过特定输入来影响某些内存内容导致对随机数发生结果的影响;不过因为有其他输入,因此这种影响导致的结果应该并不严重。不过,原则上安全程序应该尽量使用更多的 entropy 输入,而不是依赖这种不确定性吧?
Read more...今天同事跑来问我为什么没办法checkout一个子目录,发现svn提示说某个目录已有既有的、未有版本的副本(这是一个新的checkout)。
删除重新checkout,问题依旧。
检查之前的commit log,发现另外有人 svn rm 掉了 .svn 目录(看起来那个目录的内容是从其它地方复制过来)。
因为没有 svn 库本身的操作权限,也没有联系到事主(正规的做法是想办法干掉这个revision),所以尝试了下面的方法:
这样一来就可以checkout和正常操作了。不过,为什么 svn 会允许导入或删除 .svn 目录呢?哪位大牛帮忙解释一下?
Read more...intron 因任满卸任,现水木社区的 FreeBSD 版需要一名版主。哪位去申请一下?
Read more...长久不做 SA,所以有些事情变得没有以前那么敏感。昨天终于还是出事了,不过幸亏不是商业系统,如果是的话,我觉得绝对够得上是重大事故。记一笔,留个教训。
简而言之,我自己的一个有邮件服务的域名,在通过 GoDaddy 的系统修改授权域名服务器的时候出了问题。这个问题应该是 GoDaddy 的 bug 导致的,但结果很严重,那个域名的 glue 记录被全部清空了。事后检查 whois 记录看到的状态如此:
Domain ID:D104XXXXXX-LROR
Domain Name:XXXXXXXXXX
Created On:XX-XX-XXXX XX:XX:XX UTC
Last Updated On:07-Jul-2011 XX:XX:XX UTC
Expiration Date:XX-XXX-XXXX XX:XX:XX UTC
Sponsoring Registrar:GoDaddy.com, Inc. (R91-LROR)
Status:CLIENT DELETE PROHIBITED
Status:CLIENT RENEW PROHIBITED
Status:CLIENT TRANSFER PROHIBITED
Status:CLIENT UPDATE PROHIBITED
Registrant ID:CR29XXXXX
Registrant Name:Xin LI
[...]
Tech FAX:
Tech FAX Ext.:
Tech Email:XXXXXXXXXXXXXXXXXXX
__Name Server:Name Server:Name Server:Name Server:Name Server:Name Server:Name Server:Name Server:Name Server:Name Server:Name Server:Name Server:Name Server:__
DNSSEC:Unsigned
对邮件系统来说,发生这种情况的后果是极其严重的。根据 RFC 5321,邮件系统对于停机问题的容忍时间至少是数个小时,然而当域名解析出现问题时,通常系统有理由立即以 4yz 回应来拒绝未进入邮件队列的邮件。所幸的是这个问题持续的时间不算太久,而且这个域名只是一个备用的邮件域名。
Read more...在 /etc/sysctl.conf 中加入:
kern.sched.preempt_thresh=224
然后用 /etc/rc.d/sysctl start 或重启系统令其生效。
系统默认的值是 80,表示只有新优先级 < 80 时才允许抢占;224 表示非空闲线程均可以进行抢占。这样做的结果是系统会产生更多的切换,从而改善响应时间(牺牲吞吐量)。对桌面系统来说,这种设置是很有用的。
Read more...基于 LLVM 的一个 小检查器。如果代码经手人很多,或者经过了大规模的改写,这个工具就很有用了。使用说明 在此。
Read more...在开始创建 git 代码库的时候,应使用 –bare 参数。举例:
git init --bare [repo_path]
或者,如果多人开发的话:
git init --bare --shared [repo_path]
将现有代码库转换为中心式代码库:
cd /path/to/repo
mv .git ../repo.git
cd ../repo.git
git config core.bare true
rm -fr ../repo
注意,已有的克隆需要修改配置以适应新的路径。
UPDATE: 有同学问为什么不用 clone –bare,答案是为了偷懒保留配置的内容,比如 hook 等等,另一方面这样做会导致已有的其他clone失效。
Read more...