夭壽慢的 Cygwin

在軍情緊急的昨天 (2009/6/27), 本來是要幫忙解 HDMI 的 bug. 但是事件卻如雪片般地飛來~~~ 前線的 Dylan 說我 build 給他的版本有問題; Mike 多次打電話來關切; 老婆中午叫我回去教做人做事的道理, 晚上叫我教女兒英文. 另外我們的 SPDIF 規格版本太舊了, 我還得抽空上網去買新版的 SPDIF spec. 再 download 下來給 Irene 看.

然而, 真正叫人喪氣的就是: Cygwin 變得超超慢, build 一個版本似乎要好幾個小時. 我想 Dylan 應該要瘋了~~~ 為了測底消滅這個問題, 我趁 make code 的時候, 整理 Cygwin 變慢的原因如下: 

根據網路搜尋的結果, 在 Cygwin 的官網這樣解釋:

4.2.

Why is Cygwin suddenly so slow?

 

If you recently upgraded and suddenly every command takes a very long time, then something is probably attempting to access a network share. You may have the obsolete //c notation in your PATH or startup files. This now means the network share c, which will slow things down tremendously if it does not exist.

Using //c (for C:) doesn’t work anymore. (Similarly for any drive letter, e.g. //z for Z:) This “feature" has long been deprecated, and no longer works at all in the latest release. As of release 1.3.3, //c now means the network share c. For a detailed discussion of why this change was made, and how deal with it now, refer to http://sources.redhat.com/ml/cygwin/2001-09/msg00014.html.

在討論串裡面, 有類似的說明:

http://www.mail-archive.com/cygwin@cygwin.com/msg85049.html

另外一個原因好像是 Windows 2000 的 hotfix Q8114993 改了 winsock 的處理方式.

www.cygwin.com/ml/cygwin/2003-05/msg00065.html

既然我的 cygwin 本來是快的, 原因很可能出在 Windows 的 upgrade. 可惜看來看去, 網路上說的 hotfix 竟然是 2003 年的事了, 現在的這些 hotfix 並不知道要懷疑誰好? (其中 IE 8 那一包至為可疑…, 我的 notebook 灌了它之後很會當!)

再回頭看看 Cygwin 的另外一個官網 http://cygwin.com/, 裡面提到了一些實際可行的做法. 整理如下:

1. 給 Cygwin 更多的記憶體. 這個例子可以給到 1024MB, 當然, 這是指 virtual memory. 只要 Windows 的分頁記憶體比它還大就可以了.

regtool -i set /HKLM/Software/Cygnus\ Solutions/Cygwin/heap_chunk_in_mb 1024
regtool -v list /HKLM/Software/Cygnus\ Solutions/Cygwin

執行結果如下:

mounts v2\ (Cygwin)
Program Options\ (cygnus)
heap_chunk_in_mb (REG_DWORD) = 0x00000400 (1024)

2. 用 strace 跑一次 make, 從這裡可以看到很多時間花在找 path, 因此把 cygwin 的目錄往前移. 修改的地方自然是在控制台 → 系統  → 進階  → 環境變數那裡.

此外, 我也看到一個令人心痛的事實, Cygwin 花了很多時間在確認執行檔的名稱. 它先找執行檔 XXX, 再依序找 XXX.exe, XXX.lnk, 和 XXX.exe.lnk. 原來我浪費了這麼多時間在做沒意義的傻事! 

   78  373674 [main] rsdk-elf-gcc 2440 mount_info::conv_to_win32_path: src_path /rsc/ct_wu/rsdk/release/rsdk-1.4.2/cygwin/newlib/rlx-elf/lib/specs, dst g:\cygwin\rsc\ct_wu\rsdk\release\rsdk-1.4.2\cygwin\newlib\rlx-elf\lib\specs, flags 0xA, rc 0
  127  373801 [main] rsdk-elf-gcc 2440 symlink_info::check: GetFileAttributes (g:\cygwin\rsc\ct_wu\rsdk\release\rsdk-1.4.2\cygwin\newlib\rlx-elf\lib\specs) failed
   83  373884 [main] rsdk-elf-gcc 2440 geterrno_from_win_error: windows error 3 == errno 2
  116  374000 [main] rsdk-elf-gcc 2440 symlink_info::check: GetFileAttributes (g:\cygwin\rsc\ct_wu\rsdk\release\rsdk-1.4.2\cygwin\newlib\rlx-elf\lib\specs.exe) failed
   81  374081 [main] rsdk-elf-gcc 2440 geterrno_from_win_error: windows error 3 == errno 2
  117  374198 [main] rsdk-elf-gcc 2440 symlink_info::check: GetFileAttributes (g:\cygwin\rsc\ct_wu\rsdk\release\rsdk-1.4.2\cygwin\newlib\rlx-elf\lib\specs.lnk) failed
   80  374278 [main] rsdk-elf-gcc 2440 geterrno_from_win_error: windows error 3 == errno 2
  117  374395 [main] rsdk-elf-gcc 2440 symlink_info::check: GetFileAttributes (g:\cygwin\rsc\ct_wu\rsdk\release\rsdk-1.4.2\cygwin\newlib\rlx-elf\lib\specs.exe.lnk) failed
   83  374478 [main] rsdk-elf-gcc 2440 geterrno_from_win_error: windows error 3 == errno 2
   79  374557 [main] rsdk-elf-gcc 2440 symlink_info::check: 0 = symlink.check (g:\cygwin\rsc\ct_wu\rsdk\release\rsdk-1.4.2\cygwin\newlib\rlx-elf\lib\specs, 0x22C450) (0xA)
   82  374639 [main] rsdk-elf-gcc 2440 mount_info::conv_to_win32_path: conv_to_win32_path (/rsc/ct_wu/rsdk/release/rsdk-1.4.2/cygwin/newlib/rlx-elf/lib)

在 strace 裡面看到做最久的一步是 entering. 換個目錄需要很長很長的時間. 因此我想到第三步: 硬碟重組!

3. 把硬碟重新整理一下, 執行重組! 既然 Cygwin 編譯時 CPU time 是如此地少, 可見得它是 IO bound. 此時 Memory 已經給很多了, 實際上用到的記憶體 800MB 都還不到實體記憶體 1GB 的 90%, 所以可以排除 memory bound 的可能.

4. 把防毒軟體的沒用的檢查關掉一點. 把安全的檔案夾都放到 exception 裡面.

5. 把 bash.exe 的 priority 從工作管理員裡面調升到 "標準以上". 不過, 我給 Dylan 的版本就是在調升 priority 以後 make 的, 我現在不是很敢動它. 尤其是調到 "即時" 等級的話, 根本就不能 make clean  再 make all 了.

用了這幾招之後, 感覺似乎有快一點. 至少 make 一次的時間可以在 5 分鐘以內了. 不知道是不是有 bug, 哈! 其中最好的一招好像是 3: 硬碟重組. 有人知道更厲害的絕招可以教我嗎?

 

VMWare Workstation V6.5.2 的網路選項

昨天為了 pass through 的事情, 還是搞到 10 點才吃晚飯. 不過今天清晨五點多就夢到 HDMI pass through 有問題而 "嚇" 醒了. 可是我 9 點鐘還要送小孩去上學, 不可能一早衝進辦公室. 於是起來研究 VM Ware.

VM Ware 可以讓一台 PC 上並存多個作業系統, 甚至可以互相通訊. 先前裝 VMware Workstation 4.X 版的時候, Vista 直接不能開機, 所以我憤怒地將它移除. 不過, 聽說 VMWare 新版已經可以和 Vista 相容了, 所以我就再給它一次機會. 因為我還有一套正版的 XP Home, 一套正版的 XP Professional 都晾在一邊. 與其這樣, 還不如把它灌起來使用.

新的 VMWare 安裝界面變得簡單易懂多了, 所以很直觀地就可以把系統設定好. 較難弄懂得就是網路設定的部分. 網路上有人說: 勾第一個就好, 有人說為了方便就勾第二個. 光是這樣, 我們很難搞清楚其中的玄機… 

其實網路的第一個選項是 bridge, 第二個 NAT (network address translation), 第三個是 host only, 第四個是 custom. 選 bridge 的話, 這個 guest (也就是新開出來的虛擬機器 virtual machine, VM) 和主體的機器 (host) 具備同等的上網權力, 因此相當於要給 guest 一套完整設定. 若是 NAT 的話, guest 只是用虛擬 IP 分享 host IP 的上網能力. Host-only 的時候, guest 就不能上網了. 至於 custom 選項可以決定用哪一個 VMNet 上網. 我看到 VMnet1 就等於 host only, VMnet8 就等於 NAT.

為了先求苟活於亂世, 我就選了 NAT, 打算等到有空再來設定 bridge 網路. 畢竟, 我的主要需求是在 blog 架站的 PC 上寫網誌, 而避免去打開 notebook. 此事的解決之道包括: 架 DNS 站, 改 host 檔案, 或者是用另外一個網路 (例如 3G). 若是想用 3G 的話, 就得用 bridge 的設定. 唉! 一切只怪買 rounter 的時候年紀太輕, 還不懂得要指名有 NAT loopback 功能, 只好事後補救, 改東改西.

VMWare 很強大的一點是, 所選定的東西都是可以改的. 這樣給了使用者很大的彈性. 目前較不滿意的就是 guest 的視窗太小, 只有 800 x 600. 不知道受到哪一個條件的限制? 如果按照 VMWare 裡面的選項來看, 選到 2360 x 1770 也沒有問題. 如果這點解決了, 幾乎就完美了.

目前還在試用期 30 天之內, 如果用起來感覺不錯. 應該是要贊助一下開發這麼強的軟體的廠商才是.

[reference]

http://www.dk101.com/Discuz/viewthread.php?tid=54236

[20090623 補充]

要把 guest 的螢幕解析度調高, 只需要到 guest 的控制台裡面去調整, 這樣螢幕就可以愈調愈大.

 

更新到 wordpress 2.8

昨天更新了本站的版本到 2.8 版. 這次的更動意外地順利, 我想可能是外掛 wordpress automatic upgrade 被關掉了的關係. 原本自動升級的功能在某個時間點之後就再也沒有成功過了, 這次一按就 OK 還真是大喜過望! 如果有網友遇到自動更新失敗, 上傳 2~3 秒就 time out 的時候, 可以考慮把我懷疑的外掛關掉. 甚至是把所有的外掛都關掉!

這次升級過後, 我也赫然發現我的 slide show 功能全部不見了. 雖然我拍的照片的確不怎麼樣, 但是 slide show 功能失效我還是頗為在意的. 檢查了一下, Nextgen Gallery 更新之後, 它指定要配合 3.17 版的 Imagerotator 才能夠做 slide show. 平常從 gallery 裡面貼圖的功能還是不受影響!

把 imagerotator 抓回來以後, Nextgen Gallery 的 slide show 選項下面有提示:  要把 imagerotator.swf 放在 URL wp-content/uploads 下面. 起先我把它當作 plugin 一樣, 給了一個目錄名稱, 然後再按 search, 結果是失敗的. 想來想去還是滿頭霧水, 甚至想跳槽到 slideshow 那個外掛下算了. 不過靈機一動, 把 imagerotator.swf 直接放在 wp-content/uploads 下面的那一層, 不要再加子目錄. 按下 search 之後, 安裝就正式完成. 回去看 slideshow 也就都播得出來了~~~

 2.8 版有甚麼特色呢? 請參考:

升级必读:WordPress 2.8十大改进与更新详解

WordPress 2.8版推出

感覺改得不多, 主要是主題管理進步了, 還有更多外掛變得不相容了.

 

MP3 不能播的秘密

今天有個 bug 是 MP3 播不出來, 而檔頭有 MaDRM 字樣. 我想這應該就是 MarkAny 公司用 AES 加密過的 MP3 吧! 這個 DRM 技術就叫做 MaDRM.

http://www.markany.com/ch/index.asp

MarkAny 這家公司還滿有趣的, 專門做文件與多媒體的加密與浮水印. 產品包括 Document Safer, e-Page Safer, Content Safer, MAIM (water mark) 與 e-Banking (virtualization technology) 等等 . 顧名思義, 它的產品都很容易理解.

當然, 若非這個原因, 能夠讓 MP3 播不出來的可能還有很多. 包括沒有迴避美國專利  5,777,992, 而用了 spec. 上也沒說不能用的 padding bit, 那麼就有可能播不出來某些檔案. 這"某些" 檔案就是專門抓誤用了 US patent 5,777,992 的 MP3 decoder 用的. 只要能播出這些測試檔, 就證明你是清白的, 沒有參考到 padding bit.

說到迴避這個專利, 我們當然也下了一些功夫. 特別是 MTK 公司也申請了一個白濫的專利 US  patent 7,386,082 和原先的 US patent 5,777,992 相頡頏, 所以我們還得一次避過這兩個. 身為工程師去申請這種專利, 真是令人不齒啊!  但是這年頭, 臉皮厚好像還是比較吃香的~~~

另外一類播不出來的可能在於 MP3 pro. 自稱為 MP3 發明人的 Fraunhofer 公司, 把 MPEG 2.0 的 half-sampling rate 又降低了一半, 創造出 MP3 2.5. 如果不支援 8, 11.025, 12KHz, 就沒辦法播 MP3 2.5.

Fraunhofer 公司也把 AAC+ 的 SBR (spectral band replication) 技術用在 MP3 上, 製作出 MP3 pro. 這個 MP3 pro 倒是和 AAC+ 一樣有向前相容性, 所以一般 MP3 player 可以播的出來.

[reference]
US Patent 5,777,992 : Decoder for decoding and encoded digital signal and a receiver comprising the decoder

US Patent 7,386,082 : Method and related apparatus for searching the syncword of a next frame in an encoded digital signal

HDMI / SPDIF 支援頻率與格式

我們的客戶天平公司發了一個 bug 給我們, 大概是說 UI 設成 SPDIF, 同時 HDMI 會沒聲音. 當然裡面原因眾多, system 沒有關掉 SPDIF_HDMI_EXCLUSIVE 是一個, 但是真正的豬頭, ….終於知道就是天平公司自己!

天平公司買了一台ONKYO TX-SR803 的擴大機. 它會把 22.05 KHz 的訊號認成是 32KHz. 以至於 source (我們板子), sink (後面電視) 都在雞同鴨講. 我想會出這個 bug 的原因就是 HDMI 不支援 SPDIF 才有的 22.05 KHz.

這個冷門資訊其實算是有用. 我曾經整理過相關資訊, 發信向美國老闆說明. "HDMI 並沒有通包 SPDIF" . 另外一次是用來發 bug, 表示 SPDIF 少做了幾組 register. 雖然我也可以把 bug 發給美國老闆, 我還是很惡質地把 bug 發給較弱勢的 designer… 久而久之, 那封信被 Outlook 給封存了, 從此以後, 我也再沒有見著它.

為了避免我的人生如吳剛伐桂、薛西佛斯 (Sisyphus) 推石頭 — 老是在做同樣的東西. 我就把它不 confidential 的部分貼出來好了. 至少我知道哪裡有這個資訊.

KHz SPDIF HDMI
22.05 X  
24 X  
32 X X
44.1 X X
48 X X
88.2 X X
96 X X
176.4 X X
192 X X

紅色字的部分, 表示 SPDIF 最初只支援這 3 個頻率, 但現在它早已經不是吳下阿 S 了.

SPDIF burst info HDMI CEA 861 type
X AC-3 2
X MPEG 3
X MP3 4
X MPEG2 Mutli-CH 5
X AAC 6
X DTS 7
X ATRAC 1/2/3 8
X DDP a
  Dolby MAT (TrueHD) c
X WMA Pro e
X MPEG4 – ALS  
X MPEG4 AAC in LATM/LOAS  
X DRA  
  DTS-HD MA b
X MPEG (low sampling rate)  
X MP3 (low sampling rate)  
X MPEG2 Mutli-CH (low sampling rate)  
  One bit Audio 9
  DST d

[note]

2003 年版的 IEC 61937-2, AAC 只包括 MPEG2-AAC

2007 年版的 IEC 61937-2, AAC 只包括 MPEG2-AAC and MPEG4-AAC

[reference]

SPDIF: http://webstore.iec.ch/preview/info_iec61937-2%7Bed2.0%7Den.pdf

HDMI: http://msdn.microsoft.com/en-us/library/dd316761(VS.85).aspx