Mining-Pools
礦池性能優化
在嘗試最大化礦池性能時,應該關注哪些主要組件?假設程式碼非常優化(沒有任何低效率),池所有者應該將他們的注意力或資源投入到什麼方面?我正在考慮諸如硬體速度、網際網路速度、延遲或一些附加功能(如長輪詢)等因素,以及這些因素應該具有什麼優先級。
該程式碼不是最佳的,尤其是在合併探勘方面。目前,如果沒有更高級的礦工池通信協議,就沒有處理兩條區塊鏈的最佳方法。
排除合併探勘問題,延遲是一個很大的因素。當一個區塊發生變化時,每個礦工的有效雜湊算力都是零,直到他們開始處理更新的區塊頭。因此,礦池的有效算力從總算力下降到 0,然後隨著礦工的更新而上升。因此,礦池的長期有效雜湊能力取決於它處理區塊更改的速度。
這涉及三個組成部分。
- 檢測塊變化。一個好的礦池應該與比特幣網路有大量的連接,以最大限度地減少學習區塊鏈的延遲。一個好的池操作員將確保他們保持每個主要池的“關閉”(在 1 或 2 個躍點內)連接。
- 重新計算區塊頭。在一個區塊期間,每個礦工將在不同的時間完成他們的工作,因此 getwork 請求是交錯的。然而,當一個區塊發生變化時,礦池需要立即更新每個礦工的區塊頭。一個缺乏足夠處理能力來快速計算塊頭的礦池將使礦工在陳舊工作上工作的時間更長,因此平均陳舊百分比更高。按照算力的順序更新礦工可以稍微減少礦池的整體陳舊。我不知道目前是否有任何游泳池這樣做。
- 更新礦工。礦工連結的延遲超出了礦池的控制範圍,但礦池可以通過擁有多個礦池伺服器減少所有礦工的跳數來提高效率。礦池伺服器應盡可能靠近礦工。例如,一個主要由亞洲礦工組成的礦池不應該使用美國東海岸的數據中心。
NTimeRolling 減少了給定數量的雜湊所需的通信(getworks)數量。這使得池更高效,因為給定數量的硬體可以支持更多客戶端,但它不會減少塊更改時的負載。
實施長輪詢可確保在發生塊更改時通知礦工(減去上面指出的延遲),而不是繼續處理陳舊數據直到完成。400MH 礦機完成一個隨機數範圍大約需要 10 秒。平均而言,如果沒有長時間輪詢,礦工將在每次塊更改上浪費 5 秒的時間來處理永遠不會產生有效塊的數據。給定的塊更改每 600 秒發生一次,這大約是浪費在散列無效塊頭的 CPU 時間的 1%。較慢的礦工在 getworks 之間的時間較長,因此浪費了更多的 GPU 時間。如果沒有良好的長輪詢實現,任何池都不會高效。
NTimeRolling 和長輪詢 (LP) 都需要一個能正確理解這些命令的礦工。