為什麼 Tor 中繼點可能變慢,以及如何改善效能
若你的 Tor 中繼點看起來很慢或利用率不足,可能原因很多:從系統限制、網路對等連線到 Tor 自身的頻寬量測;本頁也提供實際排查與改善速度的方法。
為什麼中繼點負載會變動
洋蔥路由會管理調節整個網路上的頻寬用量,它的現行策略對於大多數的中繼節點來說,都可以運作良好。 然而,Tor 的目標與其他像是位元洪流之類的通訊協定不同。 Tor 的主要目標是提供低延遲率的網頁載入服務,因此會需要預留頻寬以提昇連線速率。 而位元洪流的目標是提供整批下載服務,因此就會盡可能的耗盡所有可用頻寬。
我們目前正在開發一個新的頻寬掃描器,以使這個部份更容易理解與維護。 它會針對未被量測或是量測率偏低的中繼節點進行診斷。
為什麼洋蔥路由會需要頻寬掃描器?
大多數的網路服務供應商會告知您網路的最大速率。 但是洋蔥路由的使用者是來自世界各地,並且他們每次都會以隨機的方式選定一兩個護衛節點來連線。 因此,我們必須要知道每個中繼節點實際上與全世界的網路連通速度是如何。
因此,即使所有中繼運營者將其公佈的頻寬設置為其本地連接速度,我們仍然需要頻寬權限來平衡網際網路不同部分之間的負載。
正常的中繼節點負載量是多少?
正常的中繼節點負載量是可用容載量的 30%-80%。 這樣對於使用者來說是最佳狀態,因為負荷超載的中繼節點其延遲率會偏高。 (我們的期望是能夠擁有足夠的中繼節點,以便讓每個節點的平均負載量都落在 10%左右,這樣 Tor 網路速度就會幾乎跟普通網際網路一樣快)。
有些時候,中繼節點速度降慢的原因,是因為中央處理器效能不足或是網路連線受到限制。 也有些時候是因為網路速度太慢造成的,例如說該中繼節點與其他節點間的連線有瓶頸,或是位處於較遙遠的地段。
找出中繼節點速度緩慢的原因
造成中繼節點速度緩慢的可能原因有很多,底下逐一說明追查的方式。
系統限制
- 請確認中繼節點主機的記憶體、中央處理器、網路接套以及檔案描述符的使用量
這些資訊有些在洋蔥路由啟動時會被記錄於歷程記錄中,另外有些資訊則可利用像是 top之類的工具軟體查得。
網路服務供應商的限制
- 確認您的中繼節點通往其他節點的網路連線(頻寬與延遲率)。 有時候中繼節點透過 Comcast 公司的網路傳輸會較慢。 位處於北美洲或西歐地區以外的中繼節點也通常會比較慢。
洋蔥路由網路限制
中繼節點的頻寬會受到節點主機本身觀測到的頻寬,或是目錄主管機構的量測值所限制。 底下方式可以查出到底是哪個量測值限制造成的:
- 查閱consensus-health(超大網頁)上各個節點針對您的中繼節點所作的投票結果,尤其是它們的平均值。 如果您的中繼節點被部份目錄主管機構標記為停機狀態的話:
- 請確認 IPv4 或 IPv6 的位址是否設定錯誤?
- 它的 IPv4 或 IPv6 位址是否無法由某些地區的網路存取到?
- 是否有多臺中繼節點使用同一個 IPv4 位址?
或者是確認您的中繼節點所觀測到的頻寬與速率(限制)。 在Metrics上查詢中繼。 將滑鼠游標移至頻寬標頭,可以得知中繼節點觀測到的頻寬值與資料傳輸率。
這裡有幾個比較細節的範例可參考:共識權重下降以及出口節點速率提昇。
要如何解決
此圖表中的最小數值會限制該中繼節點被配得的頻寬。
- 如果是頻寬資料傳輸率造成的話,那可以增加您的 torrc 設定檔裡有關 BandwidthRate、Burst 或 RelayBandwidthRate、Burst 的相關設定值。
- 如果是受觀測到的頻寬限制的話,那除非中繼節點軟體的觀測值提昇,否則它是不會調昇頻寬限制量的。 此時您就必須要更深入追查此值低落的原因。
- 如果是量測頻寬的平均值偏低的話,那就表示您的中繼節點通往大部分的頻寬主管機構主機的連線較慢所導致。 此時您就必須要更深入追查量測值低落的原因。
對中繼節點做自我量測
如果您的中繼節點軟體判定自己的速度較慢,或是被頻寬主管機構主機認定較慢的話,您可以用這種方式自行量測自己的頻寬值:
- 使用 Tor 運行測試,看看 Tor 連接到您的網路的速度有多快
為此你需要設定 tor 用戶端把你的中繼點當作入口節點。 若你的中繼點只有 Guard 旗標,請在 torrc 設定 EntryNodes 為你的中繼點指紋。 若你的中繼點沒有 Guard 旗標,或同時有 Guard 與 Exit 旗標,就不能把它設為入口節點(見 https://gitlab.torproject.org/tpo/core/tor/-/issues/22204),但你可以把它當作你的橋接節點使用,即使它並非橋接節點。 若要把中繼點當作橋接節點,請在 torrc 加入:
Bridge <ip>:<port>
UseBridge 1
接著使用 SocksPort 作為 SOCKS 代理來下載大型檔案。 為此你可以使用 curl,例如:
curl https://target/path --proxy socks5h://<user>:<password>@127.0.0.1:<socks-port>
使用不同的 user/password 可確保走不同電路。你可以使用 $RANDOM。
這能讓你大致了解中繼點可承載的流量。
或者你也可以執行 relay_bw,以兩跳電路測試你的中繼點,方式類似 sbws。
- 使用 tor 與 chutney 測試你的 CPU 上 tor 能跑多快。 持續增加資料量,直到頻寬不再上升為止。