Gea-Suan Lin's BLOG for Networking

Monday, May 29, 2006

FreeBSD 上 rpc.lockd 的問題

FreeBSD 上 rpc.lockd 常常會自己掛掉。如果是 clients 的 rpc.lockd 掛掉,會使得 flock() over NFS 掛掉,而如果是 servers 的 rpc.lockd 掛掉,會使得所有 clients 的 flock() over NFS 掛掉 =_=

這個問題自從我們將某幾台 ccbsd*.csie clients 換成 FreeBSD 6.0-RELEASE 後就發現這幾台一直有問題,後來決定將 cchome.csie 與 mailgate.csie 也一起升級到 FreeBSD 6.0-RELEASE,看看能不能解決這個問題。結果反而變成大家都有問題... -_- 而且 ccsun*.csie 只要一開機,所有的 clients 就會炸掉,但這些 ccsun*.csie 裡面,如果只開 ccserv.csie 也不會有事情...。

這個問題當時猜測是 FreeBSD 4.x 與 6.x 的 clients 混在一起跑造成的,於是狠下心來將 ccbsd*.csie 全部升級到 FreeBSD 6.0-RELEASE (另外一個原因是 FreeBSD 4.x 已經不繼續維護了),結果升級上去發現問題還是沒變好,只好試著惡搞所有能惡搞的功能 (像是 mount_nfs 裡的 -L local lock),發現還是沒有用。

前幾天想到 ktrace 可以看 system call 的情況,拿出來追,發現 uid=daemon 的 rpc.lockd 最後居然是死在 SIGPIPE,將這個 bug 用 send-pr 送出去幹剿後,rpc.lockd 的 maintainer 丟出一個神秘的 patch:把 SIGPIPE 用 signal(SIGPIPE, SIG_IGN) 堵掉,#bsdchat 上面看到這個 patch 把他叫做「掩耳盜鈴」,當作沒聽到,幹就對了 XD:Problem Report bin/97768 : NFS rpc.lockd will die automatically

雖然這個方法看起來很鳥,但我還是決定把這個 patch 弄進所有 ccbsd*.csie 上跑,然後開 ktrace 盯著看還會有什麼死法。跑了快一天,發現 ccbsd*.csie 跑起來好像不錯,寫了封信跟 maintainer 講... 沒多久就看到 cvs commit 記錄:cvs commit: src/usr.sbin/rpc.lockd kern.c,結果才剛 commit 完沒多久就發現 uid=root rpc.lockd 死掉 XD

看了一下 uid=root rpc.lockd 死掉時 ktrace 的紀錄,發現也是 SIGPIPE 的問題,正覺得奇怪,明明 mask 掉了,怎麼還會死在 SIGPIPE... 回頭看 patch 發現是因為 signal()fork() 後才做,所以 uid=root 那隻沒有處理 SIGPIPE,只好再跟 maintainer 講,問看看能不能把 signal() 放到 fork() 前。(主要是他對 rpc.lockd 比較熟,可能會比較清楚各類後遺症 XD)

結果 maintainer 就叫我去測測,沒問題就照我說的 patch 進 -current XD 我就跑去跟 chwong 要了 cchome.csie 與 mailgate.csie 的 root,要跑 ktrace 盯著看。

測了一天看起來沒問題:rpc.lockd 沒死,mutt 看信也都很正常,看起來 locking 功能運作得很好,就回封信跟 maintainer 講這個情況,過不久就看到他把 signal() 搬到 fork() 前的 cvs commit 紀錄:cvs commit: src/usr.sbin/rpc.lockd kern.c,這個 patch 的 rpc.lockd 到現在都還活得很好,看起來在 6/1 那天就會進 RELENG_6 了 :)

然後在 #bsdchat 上看到 rafan 把這個 patch 也丟進 csie.ntu 的機器上跑,發現對於 NFSv2 的 Sun 也正常多了 (打開 debug mode 還是會看到一堆 error msg,不過至少會動...),於是我剛剛就很高興的跑去學校把 ccsun*.csie 通通開起來測,目前看起來也都沒問題...

折騰了兩個月,NFS 的 rpc.lockd 這件事情看起來暫時穩定多了,希望有長輩把 rpc.lockd 修一修,尤其是 recovery 的部分,如果寫完的話才能隨意關機開機 XD

Saturday, March 18, 2006

lighttpd + WordPress 2.0 對於 Permlink 的處理

lighttpd + WordPress 2.0 使用 Permlink 的設定,重點在於 lighttpd.conf 裡的 mod_rewrite:
url.rewrite = ( "^/(archives|categories|comments|feed)/" => "/index.php" )

WordPress 裡 Permlink 則是設成:
/archives/%year%/%monthnum%/%day%/%post_id%/

Category 的部份則是:
/categories

Wednesday, March 01, 2006

FreeBSD NFS locking 問題

我們一直以為是 4.x 與 5.x/6.x 之間的問題,結果剛剛 ericlin 丟了一個這幾天的討論串過來,大光頭 Kris 還提供了一個 patch,是 lock_proc.c 這個檔案從 1.17 到 1.18 的 patch (6.0-RELEASE 是 1.18):NFS locking question

這個 patch 看起來是 transmit_result()transmit4_result() 的修正,不知道 4.x 有沒有 svc_getcaller(),如果有的話可以試著 patch 看看...

Friday, February 17, 2006

IE7 的 SSL 安全政策

有長輩測試 IE7 Beta2 後發現 IE7 Beta2 對於 SSL 設定有問題的站台會整個擋掉,而不會像以前那樣跳初一個小視窗出來要你確認:Stupid Google SSL Certificates

文章裡 舉了 的例子:他說 的某些服務使用了 www.google.com 的 SSL Certificate,但是使用的站台並不是 www.google.com。

不過我不記得 哪個服務是這樣惡搞的啊?還是 遇到同一個 Domain 的情況不會哀哀叫?這樣就太糟了...

Sunday, February 12, 2006

在交大使用 Bittorrent 的問題

這幾天用 Bittorrent 抓一些東西,發現如果不是使用 BitComet (目前唯一一個有支援 Header Encryption 的 Bittorrent Client,而且 Windows Only...),幾乎不會動 (檔案很熱門也一樣)。

即使只有放在出國電路的部份 (自己購買的出國電路),但是因為是 Default Gateway,所以可以很明顯感覺出來。

真無奈,兩邊 (ISP 與發展者) 互相鬥法,最後就得靠一些數學方法 (Cryptosystem) 決戰... 輸的永遠是使用者 (需要更多的 CPU resource 做運算)。

Friday, December 02, 2005

Apache 2.1 - MPM event

mclee 那邊看到 Apache 2.2 出版了,翻 Overview of new features in Apache 2.2 的時候看到 Apache MPM event,回頭看記錄發現 Apache 2.1 就有了。

不知道我是不是有猜錯,這應該是 Event-driven 的 module 吧?hmmm...

Monday, November 28, 2005

Linux epoll() performance

在找一些資料的時候發現 zmx 的舊文章 (也沒有很舊,半年前的文章),談 Linux epoll() performance 的改善:Comparing and Evaluating epoll, select, and poll

這篇文章裡提到了 epoll() 在 idle connection 很少的情況下,與 poll()select() 改善的空間不會太多,大概就只有省下從 kernel 要修改 userland space 的時間吧。

對於 Connection 數目很大的 HTTP server (所謂的 The C10K problem),BSD 上的 ACCEPT_FILTER_HTTP 還是很重要,可以省下 accept() 進來卻慢慢送 Header 的情況 :p

Web Performance Tools - Siege

剛剛在 ijliao 那邊看到 O3 Magazine,看了 Lighttpd 的測試報告,發現測試報告裡面不是用 ab,而是用 Siege。看了一下 ab 與 Siege 的差別:
Siege is an http regression testing and benchmarking utility. It was designed to let web developers measure the performance of their code under duress, to see how it will stand up to load on the internet. Siege supports basic authentication, cookies, HTTP and HTTPS protocols. It allows the user hit a web server with a configurable number of concurrent simulated users. Those users place the webserver "under siege."

這樣看說明可能看不太出來,Siege 與 ab 主要的差別在於同時發出的 Request 不一樣 (於是會比較逼近真實的情況)。

查了一下 FreeBSD Ports 裡面,發現在 benchmarks/siege 下面有,邊裝邊找中文的說明文件,在 Siege:压力模拟/测试工具 這篇裡面有很簡單的說明,等下來用 WWW::Mechanize 寫個小程式抓網頁 url 測試看看。