GCC 4.5.0 以及 ClangBSD

GCC 4.5.0 前幾天公告釋出:「GCC 4.5.0 Released」,而另外一邊以 clang 取代 FreeBSD 系統內 GCC 的計畫 ClangBSD 也開始徵求測試者了:「[CFT]: ClangBSD is selfhosting, we need testers now」。

目前 ClangBSD 可以在 i386 以及 amd64 上編譯 bootable-kernel 以及 world (目前的 -CURRENT 版本),平常在用 -CURRENT 的人除了上面那篇 mailing list 上的說明外,在「Building FreeBSD with clang/llvm」也有介紹更多關於要怎麼把整個系統切換過去的細節。

FreeBSD 要換掉系統內 GCC 的計畫又往前跨了一步...

Amazon 的 ELB 支援 Sticky Sessions

Amazon Web Services 大約十天前對 ELB 加上了新功能:「New Elastic Load Balancing Feature: Sticky Sessions」,這個功能想要做到同一個 session 所發出的 request 都導到同一台 server 上。以「Elastic Load Balancing with Sticky Sessions」這篇的說明來看,看起來是 Cookie-based。這在商業 load balancer 上是很常看到的功能,後端的 web server 幾乎不用修改就可以維持同一個 session 都導到同一台 server 上。

另外常見的作法是把 session 資料放到 NFS 或是 memcached 上,這樣跨機器也沒問題。

Amazon Simple Notification Service

Amazon Web Services 今天推出 Amazon Simple Notification Service (Amazon SNS),看起來比較像是 Simple Queue Service (Amazon SQS) 的變形:「Announcing Amazon Simple Notification Service」。

Amazon SQS 的架構是 poll-based,而 Amazon SNS 是 event-based,而且允許多個訂閱,可以用 HTTP/HTTPS,以及 Email/Email-JSON (這兩個東西...),另外也可以丟到 SQS。

價錢的部份,除了需要流量費用以外 (要注意的是只要 in/out SNS 就要收錢,而非跨出 Region 才收),另外也有 notification 的費用。如果自己改裝成 Sync Job Server (雖然走 HTTP 時 overhead 有點重),就目前費用看起來還蠻超值的,以 Notification 來算 (所以每次 publish 可能會有很多筆 notification),每十萬次才 USD$0.06,比起自己租用 EC2 最小台的機器做算是很方便的服務...

Email 的部份 (每十萬封要 USD$0.2) 還沒細看,不確定能實際拿來作什麼,不知道能不能當作 mailing list?

再來想看看還有什麼有趣的用途...

Amazon Web Services 頻寬合併計算

從 2010 的四月開始 (三月底就先公佈了),在同一個 billing account 下不同服務的頻寬將合併 (並不是所有的服務,請參考官方公告所列的),然後依照各區 (region) 計算:「Announcing Combined AWS Data Transfer Pricing」,除此以外每個月 Outbound 的第一個 GB 是免費的。

這對於使用量夠大的人才有差異:假設 S3EC2 的 US-East 區 Outbound 都是 10TB,舊的算法會算成兩次 10TB (前 10TB 是 USD$0.15/GB,也就是 USD$3000),而新的算法則是算成一次 20TB (第一個 GB 免費,前 10TB 是 USD$0.15/GB,再來的 40TB 部份是 USD$0.11/GB,也就是 USD$2599.85)。

10TB/month 大約是平均 33Mbps,用 Amazon EC2 跑 Facebook 外掛遊戲的應該都做的到?不過應該不會 EC2 + S3 混用,而是 EC2 + CloudFront 混用?這樣好像就虛掉了...

Pacman 的規劃

玩了幾天 Pacman,整理一些資料...

安裝完成後,預設可以使用的 package repository 可以在 /etc/pacman.conf 內看到,包括 core (目前約 340 個)、extra (~4500),以及 community (~3400)。

另外有幾兩個測試性質的,預設是關閉的。一個是 testing,另外一個是 community-testing,裡面的量都不多。

除了這些以外,使用者自己也可以提供新的套件,官方有提供 AUR (也就是 unsupported),任何人都可以註冊並且上傳,也因此所以有可能會包括有安全問題的 code。所以有 TU (Trusted Users) 的制度,當一個 package 使用的人夠多 (在「AUR Trusted User Guidelines」有說明),而且 TU 確認沒問題後就會 update 到 community 內。

要安裝 unsupported 的軟體必須必須自己下載 AUR 的 source tarball (裡面有 PKGBUILD 以及其他設定),並且確認沒有 malicious code 後再用 makepkg 安裝。

另外 Gmane 有收 ArchLinuxmailing list,習慣用 BBS 讀的人可以抓下來看。

在 VirtualBox 內安裝 ArchLinux 的紀錄

Debian 用一陣子後,發現 Python 2.6 在 lennybackports 也沒有,一定得到 squeeze (目前的 testing) 找出來用,但如此一來就會有很多問題 (像是 testing 的 python library 使用 stable 的 C library),所以一直在覺得很煩...

另外,自己架設 APT 的熟練程度一直卡在沒有自動化工具,所以一直想要試試 Linux 上其他的 package system,但又不想要用 RPM,所以就挑上 ArchLinux 了...

不過在 VirtualBox 內裝 ArchLinux 遇到一些怪問題,總算是弄的差不多,紀錄起來讓其他人有機會少踩一些雷...

首先是抓 ISO image,最新的版本可以在 http://ftp.tku.edu.tw/Linux/ArchLinux/iso/latest/ (這是淡江大學的 mirror) 這邊抓到,我在寫這篇時是抓 archlinux-2009.08-netinstall-i686.iso,抓完之後先用工具確認檔案的 md5 與 sha1 有沒有問題,避免檔案壞掉造成安裝過程或結果異常。

由於我是用 netinstall,所以得選擇 mirror site。在選擇時,記得得選擇 FTP 而非 HTTP 的 mirror site。我前幾次試著用 HTTP 試了好幾個站台都失敗,但後來選 FTP 都成功。這個問題還不知道哪裡出錯。另外要注意的是,由於我是有拿到 Public IP,所以不確定 FTP 預設是不是 passive,如果在 NAT 後面安裝的人可能要抓 core 版而非 netinstall 版避開這個問題 (因為 HTTP 不能用),或是想辦法讓 installer 告訴抓檔程式用 passive mode。

再來是檔案系統的選擇,由於我只是要玩 ArchLinux,所以決定切 / 與 swap 就好,不另外切 /boot。在 Debian 上我可以用 ReiserFS 當作根目錄,而 GRUB 可以開機,但在 ArchLinux 上我用 ReiserFS 當作根目錄會失敗,改用 ext3 才開的起來。

對於 ArchLinux 的 package system,pacman 用起來還蠻有趣的,官方 Wiki 上對於基本操作寫得很清楚 (「pacman」這篇),另外在 /etc/pacman.conf/etc/pacman.d/ 以及 /var/lib/pacman/ 下也是可以摸索的地方,要再花時間玩...

裝玩 openssh 並且跑起來後,卻發現連不上 SSH server,翻系統紀錄才發現被 TCP wrapper 擋下來了,要在 /etc/hosts.allow 裡加上 sshd 以及開放的網段。

接下來是建制基本環境,大致上就是把 Debian 上的 bash 設定複製一份過來就可以了。

WordPress 的 gzip 支援

剛剛跑 WebPagetest 才發現 WordPress 把內建的 gzip 的功能拿掉了 (差不多拿掉兩年了),所以第一個 request 不會被壓縮:「Web page performance test results for http://blog.gslin.org/ Test completed - 03/19/10 22:24:51 from Dulles, VA - 1.5Mbps ADSL」。

可以在 WordPress Codex 上看到說明以及建議的解法:「Output Compression」,不過在 SharkSpace 的主機上用 .htaccess 的方式完全沒效果,還不曉得是什麼問題...

由於首頁的 request 不壓縮與壓縮會有 40KB 以上的差距 (從 63KB 到 18KB),能夠解決 PHP 輸出的部份其實就解的差不多了,在找了 WordPress 的 Plugin 後,目前是裝 GZIP Output,目前看起來沒什麼問題...

P3PC (Performance of 3rd Party Content)

Steve Souders 開了一個「Performance of 3rd Party Content」,分析 3rd party script 的效能。目前已經分析了四個 js。

看完四個 js 的分析後,可以看出來一些 pattern:

  • 用 async script。Google 曾經介紹 Google Analytics 可以使用 async script:「Google Analytics Launches Asynchronous Tracking」。
  • 當使用 async script 時無法使用 document.write (會有奇怪的結果),就算不是 async script 也應該儘量避免使用。常見的方法是建立一個帶有 iddiv,然後在 script 內用 document.getElementById() 或是等價的方式取得後在裡面插入元素,或是直接修改 innerHTML
  • div 再修改的模式時,如果可以先確定 div 的大小,最好在 class 與對應的 CSS 上先定義 (像是廣告的版位),可以避免頁面 re-layout。
  • Cache-Control 內設定夠長的 max-age (尤其是幾乎不會改動的圖片)。
  • 如果是 tracking 機制,應該傳回 204 而非 200。

這個計畫應該還會再繼續分析,有興趣的人可以訂 RSS 看。

改寫 wretch-albumexpander.js (無名小站相簿展開程式)

這次主要是把之前用 jQuery 1.2.6 的需求改寫,改用 getElementsByClassName()getElementsByTagName() 以及 getElementById() 取得元素,然後用 .innerHTML 直接換掉內容。

由於這次改寫避免使用 unsafeWindow 以及複雜的 GM_* 函式,在 Google Chrome 除了遇到一個小問題之外 (可以寫一段 code workaround),目前跑起來還蠻正常的。

參考:「Wretch Album Expander」以及 GitHub 上的「gslin's albumexpander」。

bsdftpd-ssl 的設定

要從紐約的主機上面拉檔案回台灣,發現 SFTP 速度只有 20KB/sec,這是因為目前 SSH 實做的方式對 latency 很敏感,在「High Performance SSH/SCP - HPN-SSH」這篇有提到相關的問題以及針對 OpenSSH 的 patch。不過,我想要用 freebsd-update 維護系統的 security update,所以我不想動到系統內的 OpenSSH。

另外一個想法是透過 FTPS 抓檔案,有不少 server software 都有支援 FTPS。在找 bsdftpd-ssl 的資料時找到以前寫的「在 FreeBSD 上支援 SSL 的 ftpd」這篇,結果發現這篇文章是因為當初 bsdftpd-ssl 在 FreeBSD 上無法編譯而改用 ftpd-tls 所寫的。現在這個問題已經解決了,但找不到之前用 bsdftpd-ssl 所設的設定可以抄,只好再 man ftpd-ssl 看一次參數。

除了先到 portsftp/bsdftpd-ssl 目錄下安裝外,還需要產生 self-signed certification。產生的步驟可以參考「OpenSSL Command-Line HOWTO」這篇的「How do I generate a self-signed certificate?」這個部份。把 certification 輸出到 /etc/ssl/certs/ftpd.pem (如果目錄不存在則建立一個),並把檔案權限改成 600 或是 400。

再來是設定 /etc/rc.conf.local (bsdftpd-ssl 不屬於 system 內建軟體,所以放到 local),增加兩行:

bsdftpd_ssl_enable="YES"
bsdftpd_ssl_flags="-D -h -l -p /var/run/ftpd.pid -z secure"

然後用 /usr/local/etc/rc.d/bsdftpd-ssl start 跑起來就可以了。測試時要注意 active 與 passive 以及防火牆的設定,在 debug 時除了錯誤訊息外,可以用 sockstat | grep ftpd 以及 tcpdump 觀察。

實際抓一個 500MB 的檔案,到最後面可以跑到 295KB/sec,比起 SFTP 快上不少。