2011-04-19 60 views
2

我們正在爲不同的網站開放大約100個stream_socket_client連接。用gethostbyname使stream_socket_client更快?

有時候這需要一段時間,我的假設是因爲IP地址解析(例如高達40秒,然後重複嘗試4-5秒)。我知道我們也可以在軟件中緩存IP地址(讓他們使用gethostbyname),但問題是有些網站在共享IP上,有些網站使用子域名(與主域相同的IP)。因此,如果我們只使用IP,請求將始終轉到同一地點,而不是該IP上的不同站點。

是否有解決方法,以便我們可以提高速度並鎖定我們想要的網站?

+0

打開所有連接時,php的系統資源負載是多少?你的服務器環境是什麼樣的? – 65Fbef05 2011-04-19 11:22:05

+0

負載很小,它是一個16核心服務器,運行CentOS – freediver 2011-04-20 19:13:07

回答

2

DNS緩存是一個很好的主意,但我建議在應用程序之外進行;我已經使用PowerDNS recursor多年來的優異成績,它是很好的固體代碼。 (PDNS通過從Dan Bernstein的DNS recursor軟件中學習,避免了一些標題製作安全缺陷)

通過在應用程序之外進行緩存,可以避免完全擔心嘗試將IP與正確的IP進行匹配Host:您的請求中的標題,您可以完全訪問DNS內置的緩存智能。 (PDNS將尊重結果的生存時間,這將需要您的團隊努力重新正確地實施。)

但我認爲問題的很大一部分是,DNS請求可能是在您的申請,前一個已經返回。如果你一整天會碰到相同的100個名字,那麼使用PDNS-recursor可能就足夠了。

如果每個請求的100個名稱沒有太多重疊,那麼您可能需要並行化您的應用程序所做的DNS請求,以便您可以同時有100個未完成的DNS請求,而不僅僅是一個同時出色的要求。一種'便宜'的方法是將所有請求交給一個外部程序,該程序可以啓動幾十個線程並請求所有名稱。 (並將它們放在地板上,依靠PDNS-recursor緩存它們)。更多的工作是直接在PHP程序中創建幾十個線程或進程來執行所有查找。這可以讓您直接使用答案,或者在舊的順序代碼執行查找之前預填充您的PDNS-recursor緩存。

而且大部分工作都將完全轉移到異步DNS請求,例如libadns庫提供。如果存在沒有在100個名稱查找的不同突發之間重疊,則這將提供最大的益處。

+0

謝謝,這是一個非常詳細的答案。 – freediver 2011-04-20 19:14:37

1

如果您將主機名和IP地址輸入主機文件(在Windows機器上,在* nix機器上爲/etc/hosts%SystemRoot%\system32\drivers\etc\hosts),則可以輕鬆加速解決方案。

您可能必須更改/etc/host.conf中的配置(我不知道要在哪裏更改Windows),因爲默認情況下,首先嚐試詢問指定的名稱,然後檢查/etc/hosts文件。

爲確保系統中實現的gethostbyname函數的工作原理,請嘗試找到正確的手冊頁(即http://linux.die.net/man/3/gethostbyname)。

+0

這不是一個解決方案,因爲我們有成千上萬個站點,並且當共享IP上有兩個站點(具有不同的域)時它不能解決問題。 – freediver 2011-04-20 19:14:21