virtualbox port forwarding 太慢的原因和解法

這標題其實不太正確, 這是一連串的巧合造成的誤會。我的配置如下:

  • Windows 7 當 host OS
  • Ubuntu 當 guest OS
  • 網路模式用 NAT mode
  • 有設 port forwarding, 像是 host 的 10022 會導向 guest 的 22; 18000 會導向 guest 的 8000。

所以, 我可以在 Windows7 用 putty 連向 localhost 10022, 開始寫程式, 要跑 web dev server 時, 就跑在 port 8000。於是可在 Windows 7 裡打開瀏覽器, 連向 localhost:18000, 連上 Ubuntu 裡的 web dev server

但詭異的是, 連 ssh 和 apache2 都沒問題, 連向 web dev server 時卻會很慢。另外試了 python SimpleHTTPServer 也很慢。

卡了好幾天後, 聽同事 P 的建議, 用 tcpdump 在 guest OS 裡看封包狀況, 發現它會五秒傳一批, 等五秒再傳下一批。讀一次網頁包含 css、js 等, 一次會下載多個檔案, web dev server 則是十秒回傳一個, 相當有規律。

看到這種規律的延遲情況, 讓我想到可能原因是 domain name 反查 time out, 之前在連 ssh連 mysql 時都發生過。

但是這回我有在 guest 的 /etc/hosts 設自己的 IP 反查, 不明白原因在那。最後亂試發現, 在 /etc/hosts 裡設 gateway 的 IP 反查就解決了 (用 route 查 gateway IP; 名稱可以隨便設, 反正都是區網 IP)。再研究一陣子才發覺, 連向 host 透過 port forwarding 傳向 guest 時, 來源 IP 會變成 guest 的 gateway。而上述兩個會延遲的 web server, 都會顯示來源連線的 domain name, 查不到時才會改顯示 IP。因此固定延遲五秒

附帶一提, 這次我又犯之前的錯, 改了 /etc/hosts 後用 host 和 nslookup 測, 結果一直沒反應。看到之前的心得才發覺它們沒有呼叫 gethostbyaddr()。用 ltrace 跑 dev server 有看到 gethostbyaddr 的字, 但是是出現在 memcpy 的參數裡, 不知實際情況怎麼運作的。之後有機會再來連研究上述兩者 web dev server 的原始碼。

留言

這個網誌中的熱門文章

(C/C++ ) 如何在 Linux 上使用自行編譯的第三方函式庫

熟悉系統工具好處多多

virtualbox 使用 USB 裝置