2013-09-26 44 views
2

響應速度緩慢,我開始有這樣的疑問: Gearman: 3 seconds between client request and worker receive. Is this normal?Gearman的PHP擴展:死作業服務器=所有工人

環境:

  • 的Ubuntu 12.04桌面
  • PHP 5.3.10
  • 的Gearman (帶PHP Extension 1.1.1的libgearman 1.1.5)
  • 局域網上的多臺服務器

我無法獲得小於3秒的工人響應時間,我無法弄清楚原因。我將其縮小到我創建的包裝類。然後,我進一步將其縮小到課堂中的一種特定方法。長話短說,真正的問題似乎在於PHP擴展中的GearmanWorker的addServer方法。

我的包裝類試圖連接到3個Gearman作業服務器。實際上只有2個正在運行。當我嘗試連接到所有3時,我收到關於第三個無法連接的警告。我也得到了3秒的工作人員迴應時間。當我刪除嘗試添加服務器當前下降的工作服務器,那麼工作人員的響應時間大約爲0.003秒。

現在你可能會問,爲什麼不直接從服務器列表中刪除服務器以連接?那麼,首先它不會總是下降。其次,當一個服務器當前運行或5分鐘前運行的服務器不再運行時會發生什麼?所有工作現在至少需要3秒。現在我認爲可能有一種方法可以將該超時配置降至1秒,但是更好的解決方案IMO可以從該列表中刪除服務器正試圖從中獲取作業的服務器。

在我的研究中有一個addServer方法。還有一個addFunction方法。然後有一個取消註冊方法,用於從給定工作人員的列表中刪除工作人員功能。但是,我看不到removeServer方法。

那麼,有沒有辦法在GearmanWorker中剔除作業服務器的列表,或者是否需要殺死對象,重新實例化它,然後重新連接到可用作業服務器的新的已選擇列表?殺死並重新啓動GearmanWorker似乎並不理想。

掃描(並連接到)所有活動作業服務器的最佳方式是什麼,同時避免了已經死亡的作業服務器固有的超時?

謝謝

回答

1

因此,最終看來,我不是唯一一個這個問題。谷歌的Gearman團隊中沒有人可以指出解決方案。因此,最終我編寫了自己的代碼(從Gearman Monitor中獲取代碼)來確定哪些作業服務器已啓動並正在運行,哪些沒有運行。

try { 
      $cxn = @fsockopen($ip, $gHosts->ports[$host], $errCode, $errMsg, $timeout); 

      /* Using the new \Net_Gearman_Manager on a dead job server kept leading to 
      * fatal error which was uncaught. Thus crashing the script and leading 
      * no update of the server status 
      */ 
      //$gearmanManager = new \Net_Gearman_Manager($ip . ':' . $gHosts->ports[$host], 1); 

      if ($cxn === FALSE) { 
       write_log($fLog, 'Connection FAILED'); 
       $output[$host] = FAILURE; 
      } else { 
       write_log($fLog, 'Connection Succeeded'); 
       $output[$host] = SUCCESS; 
      } 
     } catch (Net_Gearman_Exception $e) { 
      write_log($fLog, $e->getMessage()); 
      $output[$host] = FAILURE; 
     } catch (Exception $e) { 
      write_log($fLog, $e->getMessage()); 
      $output[$host] = FAILURE; 
     } // if (@$wrkr->addServer($ip, $gHosts->ports[$host])) 

$ gHosts類是一個配置類,它爲每個潛在的Gearman作業服務器保存IP和端口。我轉過$ gHosts中的每個潛在作業服務器並測試它。

然後我把這個輸出寫到memcache和一個文本文件中。直到我開始真正嘗試加載機器時,單獨的memcache才能正常工作。然後,memcache連接將重複失敗。現在我使用文本文件作爲備份,問題消失了。

我存儲最後一次嘗試連接到陣列中的每個Gearman作業服務器,其中密鑰是服務器的名稱,值是最後一次嘗試的時間戳。如果嘗試成功,則時間戳是肯定的。如果嘗試失敗,則時間戳爲負值。時間戳允許我確定數據是陳舊的還是新鮮的。

然後在使用Gearman的腳本中,我有一個圍繞PHP擴展類的Client和Worker包裝類。他們處理更新自動需要的時間範圍內的連接。這樣,停止響應的Gearman作業服務器停止使用,腳本在短時間內可能很慢,但運行速度通常很快。

希望這可以幫助那裏的人。

相關問題