為什麼中繼節點的負載量差異會很大

洋蔥路由會管理調節整個網路上的頻寬用量,它的現行策略對於大多數的中繼節點來說,都可以運作良好。 然而,Tor 的目標與其他像是位元洪流之類的通訊協定不同。 Tor 的主要目標是提供低延遲率的網頁載入服務,因此會需要預留頻寬以提昇連線速率。 而位元洪流的目標是提供整批下載服務,因此就會盡可能的耗盡所有可用頻寬。

我們目前正在開發一個新的頻寬掃描器,以使這個部份更容易理解與維護。 它會針對未被量測或是量測率偏低的中繼節點進行診斷。

為什麼洋蔥路由會需要頻寬掃描器?

大多數的網路服務供應商會告知您網路的最大速率。 但是洋蔥路由的使用者是來自世界各地,並且他們每次都會以隨機的方式選定一兩個護衛節點來連線。 因此,我們必須要知道每個中繼節點實際上與全世界的網路連通速度是如何。

因此,即使所有中繼運營者將其公佈的頻寬設置為其本地連接速度,我們仍然需要頻寬權限來平衡網際網路不同部分之間的負載。

正常的中繼節點負載量是多少?

正常的中繼節點負載量是可用容載量的30%-80%。 這樣對於使用者來說是最佳狀態,因為負荷超載的中繼節點其延遲率會偏高。 (我們的期望是能夠擁有足夠的中繼節點,以便讓每個節點的平均負載量都落在10%左右,這樣 Tor 網路速度就會幾乎跟普通網際網路一樣快)。

有些時候,中繼節點速度降慢的原因,是因為中央處理器效能不足或是網路連線受到限制。 也有些時候是因為網路速度太慢造成的,例如說該中繼節點與其他節點間的連線有瓶頸,或是位處於較遙遠的地段。

找出中繼節點速度緩慢的原因

造成中繼節點速度緩慢的可能原因有很多,底下逐一說明追查的方式。

系統限制

  • 請確認中繼節點主機的記憶體、中央處理器、網路接套以及檔案描述符的使用量

這些資訊有些在洋蔥路由啟動時會被記錄於歷程記錄中,另外有些資訊則可利用像是top之類的工具軟體查得。

網路服務供應商的限制

  • 確認您的中繼節點通往其他節點的網路連線(頻寬與延遲率)。 有時候中繼節點透過 Comcast公司的網路傳輸會較慢。 位處於北美洲或西歐地區以外的中繼節點也通常會比較慢。

洋蔥路由網路限制

中繼節點的頻寬會受到節點主機本身觀測到的頻寬,或是目錄主管機構的量測值所限制。 底下方式可以查出到底是哪個量測值限制造成的:

  • 查閱consensus-health(超大網頁)上各個節點針對您的中繼節點所作的投票結果,尤其是它們的平均值。 如果您的中繼節點被部份目錄主管機構標記為停機狀態的話:
    • 請確認IPv4或IPv6的位址是否設定錯誤?
    • 它的IPv4或IPv6位址是否無法由某些地區的網路存取到?
    • 是否有多臺中繼節點使用同一個IPv4位址?

或者是確認您的中繼節點所觀測到的頻寬與速率(限制)。 在Metrics上查詢中繼。 將滑鼠游標移至頻寬標頭,可以得知中繼節點觀測到的頻寬值與資料傳輸率。

這裡有幾個比較細節的範例可參考:共識權重下降以及出口節點速率提昇

要如何解決

此圖表中的最小數值會限制該中繼節點被配得的頻寬。

  • 如果是頻寬資料傳輸率造成的話,那可以增加您的torrc設定檔裡有關BandwidthRate、Burst或RelayBandwidthRate、Burst的相關設定值。
  • 如果是受觀測到的頻寬限制的話,那除非中繼節點軟體的觀測值提昇,否則它是不會調昇頻寬限制量的。 此時您就必須要更深入追查此值低落的原因。
  • 如果是量測頻寬的平均值偏低的話,那就表示您的中繼節點通往大部分的頻寬主管機構主機的連線較慢所導致。 此時您就必須要更深入追查量測值低落的原因。

對中繼節點做自我量測

如果您的中繼節點軟體判定自己的速度較慢,或是被頻寬主管機構主機認定較慢的話,您可以用這種方式自行量測自己的頻寬值:

  • 使用 Tor 運行測試,看看 Tor 連接到您的網路的速度有多快

    For this, you need to configure a tor client to use use your relay as entry. If your relay has only Guard flag, set EntryNodes with your relay fingerprint in torrc. If your relay doesn't have Guard flag or it has Guard and Exit flags, you can't set your relay as an entry node (see https://gitlab.torproject.org/tpo/core/tor/-/issues/22204), but you can set it as your bridge, even if it is not a bridge. To set your relay as a bridge, add to your torrc:

    Bridge <ip>:<port>
    UseBridge 1
    

    Then download a large file using your SocksPort as a socks proxy. For this, you can use curl, eg:

    curl https://target/path --proxy socks5h://<user>:<password>@127.0.0.1:<socks-port>
    

    Using different user/password guarantees different circuits. You can use $RANDOM.

    That will give you some idea of how much traffic your relay can sustain.

    Alternatively, you can run relay_bw to test your relay using 2 hops circuits, in a similar way as sbws does.

  • Run a test using tor and chutney to find out how fast tor can get on your CPU. Keep increasing the data volume until the bandwidth stops increasing.