網頁

2006年5月28日 星期日

pf + smp + nogaint network stack = ?

剛剛看到大神這篇「升級到 6.1-RELEASE」裡面喊說因為腳踏車鎖(Giant lock)太多,所以就把 root server 衝到 6.1 了,真的是勇敢的長輩 XD。不過我是看到 GIANT LOCK 才想到我忘了說我遇到的狀況,所以才趕快來紀錄一下。

話說我家美人機到了之後總是會亂 panic 及亂七八糟的事情,在這一篇有稍微提到我後來換 ipnat 之後改善很多,不過偶爾還是會從網路上消失。後來大概在五月中的時候, 看到 mailing list 有人疑似有類似的情形,環境也是 smp ,後來過了不久某篇裡面談到:

This is very similar to the UID/GID filtering problem. What appears to
be happening is on the inbound path, we pickup the pfil lock and attempt
to pickup the inp info lock, while on the outbound path, we hold the inp
info lock across ip_output which will try to pickup the pfil lock.

This problem is the result of a layering violation, in reality the
firewall should not be picking up layer 4 related locks. Myself and a
few others have been discussing this problem for quite some time now,
and hopefully it won't be long before we can come up with a solution
that will make everyone happy.

For now, you should be able to set debug.mpsafenet to 0 which will
re-enable Giant in the network stack, in theory preventing the deadlock.

debug.mpsafenet=0

in your loader.conf

Let me know if this helps


 於是乎,測試了一下,把腳踏車鎖關掉,開機會看到:「WARNING: MPSAFE network stack disabled, expect reduced performance.」
Copyright (c) 1992-2006 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
        The Regents of the University of California. All rights reserved.
FreeBSD 6.1-STABLE #3: Wed May 17 22:41:10 CST 2006
    cookys@ddbeauty.iecs.us:/usr/obj/usr/src/sys/DDBEAUTY
WARNING: MPSAFE network stack disabled, expect reduced performance.
ACPI APIC Table: <GBT    AWRDACPI>
Timecounter "i8254" frequency 1193182 Hz quality 0
CPU: Intel(R) Pentium(R) D  CPU 2.66GHz (3340.93-MHz K8-class CPU)
  Origin = "GenuineIntel"  Id = 0xf47  Stepping = 7

 然後「感覺上」pf 好像反應比 ipnat 好,不過可能是錯覺 XD。雖然說腳踏車鎖一次就會綁一大堆,不過在會亂 dead lock 的狀況下也只能先打開撐著,看什麼時候他們解決 XD。至少跑到現在,兩個禮拜多都沒消失了,除了前一個禮拜被學校裝笑為把她 halt 等停電以外 :p

這時候該高呼,"捷安特鎖"我愛你嗎?(我沒有打廣告喔 @_@) 

2006年5月10日 星期三

eaccelerator + php5

剛剛在弄 mediawiki 才發現原來我家的 eaccelerator 根本一直都沒跑阿,花了一些時間看到底問題出在哪裡,發現原來是被擺到了。再安裝厚的提示訊息寫著:
*****************************************************************************

You have installed the eaccelerator package.

Edit %%LOCALBASE%%/etc/php.ini and add:

zend_extension="%%PREFIX%%/lib/php/%%PHP_EXT_DIR%%/eaccelerator.so"

Then create the cache directory:

mkdir /tmp/eaccelerator
chown www /tmp/eaccelerator
chmod 0700 /tmp/eaccelerator

*****************************************************************************

但是實際上如果去 /usr/local/etc/php.ini 設 zend_extension 事實上他會不理你。所以還是得設到 /usr/local/etc/php/extensions.ini 裡面去:
extension=eaccelerator.so 

本來是直接 copy/paste 他的路徑,結果 php -v 下去就又被 ooxx 。所以現在看起來,是真的有跑了:
PHP 5.1.4 (cli) (built: May  9 2006 10:48:26)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies
    with eAccelerator v0.9.5-beta2, Copyright (c) 2004-2006 eAccelerator, by eAccelerator

被 ports 的 hint message 擺道,很無言的阿!

PS. 前幾天  FreeBSD 的 php 好像地震了一下:
20060506:
  AFFECTS: users of PHP
  AUTHOR: ale@FreeBSD.org

  The old PHP slave ports (phpN-cli, phpN-cgi and mod_phpN) were removed
  in favour of unified PHP ports that allow building any combination of
  PHP SAPIs (cli, cgi and apache module).
  The PHP CGI binary was renamed to php-cgi, so you should update
  the path in your script. To simplify the update process, *only* for
  this release a 'php' compatibility symlink to php-cgi will be created
  if you don't select the CLI SAPI.
  Before the upgrade you *should* run 'make config' in lang/php4 or
  lang/php5 to configure the SAPIs you want to install.
  As a consequence the default binary packages include the CLI and the
  FastCGI SAPIs.
 

所以順手把他重新 make 了一次,進 php 打 make config 勾一勾然後 portupgrade -f 'php*' 下去就搞定了 :p

mediawiki + mysql5.1 beta

剛剛在裝 mediawiki ,本來理論上 make install clean 就能搞定的東西裝了好久。我還笑著跟把妹揚說,搞不好他那裡下去打 make install clean 會直接 ok 也說不定。(把妹楊最近被惡魔化了,雖然他本來就是壞人,不過被惡魔化倒應該是頭一遭。他lab裡的機器現在是 FreeBSD 6 喔!嘿嘿)。原因是因為之前手賤然後現在就遇到很多神秘的問題。

這篇有 提過因為 mysql5.1.7 beta吃了一點小苦頭,而這個問題也同樣發生在 mediawiki 的 CREATE TABLE 的 sql 檔上面。一開始是一度懷疑是不是因為我自己白目去抓 mediawiki 的 svn (自以為以後升級比較方便,可是從 FCU 抓那邊真的是他 X 的慢...)所以爛掉,後來從 ports 裝也是相同的情形,可是現在 mysql 上面又跑幾個東西再上面了,要再 downgrade 其實也可說是頗麻煩,於是就很任命的開始找。一開始看到 Syntax error 大概有個底,照上次經驗把 TYPE 清光光大概就會動。不過後來就很莫名其妙了。

一開始發生 index key 不能 > 1000 bytes 的情形,可是怎麼看都莫名其妙,後來 google 到說原來 utf8 會比較機車,於是就開始 try and error 慢慢調整。之後遇到
A database error has occurred Query: SET NAMES utf8

然後卡關卡好久後才發現原來是因為我一開始就在 my.cnf 設了
init_connect = 'SET NAMES UTF8;'

然後 mediawiki 又自己做了一次,所以不知道該算是誰的錯?解法是把 include/Database.php Line 310 那附近的 $this->query( 'SET NAMES utf8' ); 給幹掉,然後就天下大平了。

如果有需要的可以拿我亂改的 sql 檔蓋到 /maintenance/mysql5/ 底下的 tables.sql,不過爆炸不負責就是。這裡下載

2006年5月8日 星期一

apache22 + MPM=worker 遇到神秘問題

我家美人愛鬧脾氣,從取進門來之後總是沒安份過。到現在還是會動不動就 *panic* 一下。上次追了半天甚至還換了硬碟後來發現,原來是 PF 在搗蛋,只要有開 pf 幾乎是沒一下子就沒不理人了。而且還是沒有 panic 掉,只是就直接 hang 住不知道是怎樣。後來換回很久沒用的 IPFilter + ipnat (好像從 PF port 進 base ,印象中是 5.x 之後我就 switch 過去了...那年代的 ipnat 好像還沒有 rc 好吃)。

於是呢,把 pf 那幾行 mark 掉之後加上
ipnat_enable="YES" # Start ipnat function
ipnat_rules="/etc/ipnat.rules" # rules definition file for ipnat

原本想說可以就此過著幸福快樂的生活,他確實也安分了幾天,不過在開暗黑大會的時候據說某把妹揚按了 wiki 的編輯,這台主機就又失連了。衝回來看才發現又 tcp6 啥小的 panic 了 XD。想說搞不好是踩到 7-current 的地雷了,那閒閒沒事來 downgrade 好了。於是就 cvs 成 RELENG_6 的 tag 衝到 6.1-RC(理論上就是現在的 RC2 iso),不過一開 pf 還是馬上就 say 沙要那那。真是一整個獄卒,那想說好吧來升一下 ports ,明明我就才裝沒多久為啥 apache22 的版本能差那麼多。某把妹楊都已經跑到 2.2.2 了我還在很後面,明明還裝不到一個月版號就跳了兩跳阿。

在 make 的時候才發現,咦,怎麼 top 只看到一顆 cpu ,哇哩咧,忘了編 SMP 進去。(沒辦法阿,以前的機器都沒有 SMP 的阿阿阿阿阿)。於是又很苦的重新弄了一次 kernel ,想說好不容易可以休息了吧,要偶爾當一下我也不能阻止他了。
但是好死不死,最後很手賤的 delete-old-libs ,然後似乎就有東西爆炸了 -_-。 php 就得重編,然後一連串的 recursion。到最後實在是不行,就丟給 portupgrade 去攪,弄了半天 apache 還是不肯乖乖起來。於是乎我看到 httpd-error.log 出現一大堆神秘的錯誤訊息:
Fatal error 'kse_exit() failed for system scope thread' at line 1215 in file /usr/src/lib/libpthread/thread/thr_kern.c (errno = 22)
Fatal error 'kse_exit() failed for system scope thread' at line 1215 in file /usr/src/lib/libpthread/thread/thr_kern.c (errno = 22)
Fatal error 'kse_exit() failed for system scope thread' at line 1215 in file /usr/src/lib/libpthread/thread/thr_kern.c (errno = 22)

於是就跑去看 thr_kren 可是看不出所以然來...google 半天也沒相關的資訊,不知道是 keyword 給錯還是怎樣。忽然靈機一動,想說看看是不是哪些 lib 掛了,於是看了一下 ldd:
ddbeauty# ldd /usr/local/sbin/httpd
/usr/local/sbin/httpd:
libm.so.4 => /lib/libm.so.4 (0x800688000)
libaprutil-1.so.2 => /usr/local/lib/libaprutil-1.so.2 (0x8007a3000)
libexpat.so.6 => /usr/local/lib/libexpat.so.6 (0x8008ba000)
libiconv.so.3 => /usr/local/lib/libiconv.so.3 (0x8009dc000)
libapr-1.so.2 => /usr/local/lib/libapr-1.so.2 (0x800bcc000)
libcrypt.so.3 => /lib/libcrypt.so.3 (0x800cf2000)
libpthread.so.2 => /usr/lib/libpthread.so.2 (0x800e0b000)
libc.so.6 => /lib/libc.so.6 (0x800f35000)
libpthread.so.2 => /lib/libpthread.so.2 (0x80112d000)

看不出所以然來阿,跟其他台比較明明是一樣的:
cdst# ldd /usr/local/sbin/httpd
/usr/local/sbin/httpd:
libm.so.4 => /lib/libm.so.4 (0x280ca000)
libaprutil-1.so.2 => /usr/local/lib/libaprutil-1.so.2 (0x280e0000)
libexpat.so.5 => /usr/local/lib/libexpat.so.5 (0x280f5000)
libiconv.so.3 => /usr/local/lib/libiconv.so.3 (0x28113000)
libapr-1.so.2 => /usr/local/lib/libapr-1.so.2 (0x28201000)
libcrypt.so.3 => /lib/libcrypt.so.3 (0x28224000)
libpthread.so.2 => /usr/lib/libpthread.so.2 (0x2823d000)
libc.so.6 => /lib/libc.so.6 (0x28264000)

於是一籌莫展的情況下就開始惡搞,想到說 libpthread 反正是 user level thread 其實根本沒啥用,那來把他丟給 libthr 玩玩好了,於是就去改 /etc/libmap.conf (這檔案竟然沒 example ,還好我不知道哪看來記得有 man libmap.conf 好抄..)於是加了:
[/usr/local/sbin/httpd]
libpthread.so.2 libthr.so.2

於是美人與阿啪器過著幸福快樂的日子。 一整個神秘。

PS. 是在 apache-worker-2.2.2 Version 2.2 of Apache web server with worker MPM. 遇到的
UPDATE: 這篇草稿忘了發,沒想到才過兩天就上了 6.1-RELEASE 的 tag 了,我要不要重編咧?