2011-06-02 62 views
3

我創建的Linux機器上的一個Python web服務(Ubuntu的):慢WebService的問題

import soaplib 
import os 

from soaplib.core.service import rpc, DefinitionBase, soap 
from soaplib.core.model.primitive import String, Integer 
from soaplib.core.server import wsgi 
from soaplib.core.model.clazz import Array 

def runcmd(cmd): 
    fout = os.popen(cmd) 
    out = fout.read() 
    return out 

class LinuxServices(DefinitionBase): 
@soap(String, String,_returns=Array(String)) 
def df(self,server, user): 
    L = [] 
    cmd = 'df -hP | grep "/"' 
    output = runcmd(cmd).split('\n') 
    for n in xrange(len(output)-1): 
     out = output[n].split() 
     L.append('%s;%s' % (out[5], out[4])) 
    return L 

if __name__=='__main__': 
try: 
    from wsgiref.simple_server import make_server 
    soap_application = soaplib.core.Application([LinuxServices], 'tns') 
    wsgi_application = wsgi.Application(soap_application) 
    server = make_server('0.0.0.0', 7789, wsgi_application) 
    server.serve_forever() 
except ImportError: 
    print "Error: example server code requires Python >= 2.5" 

我創造了它在此基礎上例如:soaplib helloworld

然後(在Windows 7)我創建了一個Silverlight項目,這裏我用這個WS讓我的Linux服務器上的磁盤狀態:

服務在Silverlight項目:

public class LinuxService 
{ 
    [OperationContract] 
    public List<dfItem> df() 
    { 
     List<dfItem> dfItems = new List<dfItem>(); 

     WebReference.Application app = new WebReference.Application(); 

     var result = app.df(new WebReference.df()/*...*/); 

     foreach (var item in result.dfResult) 
     { 
      string[] info = item.Split(';'); 

      dfItem dfItem = new dfItem() 
      { 
       MountPoint = info[0].ToString(), 
       Usage = info[1].ToString() 
      }; 
      dfItems.Add(dfItem); 
     } 
     return dfItems; 
    } 
    //... 
} 
頁面上

呼叫服務:

protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    LinuxServiceClient client = new LinuxServiceClient(); 

    client.dfCompleted += new EventHandler<dfCompletedEventArgs>(client_dfCompleted); 

    client.dfAsync(); 
} 

void client_dfCompleted(object sender, dfCompletedEventArgs e) 
{ 
    DG.ItemsSource = e.Result; 
    DG.Visibility = System.Windows.Visibility.Visible; 
} 

我的問題是,當我瀏覽這個頁面時,它需要4-8秒鐘就可以(在LAN WS)從WS數據。

我真懷疑線路帶寬可以創建此等待時間......

我的問題: 你有什麼建議,我能做些什麼來加速這個?

系統信息:

  • UbuntuServer 11.04

  • 的Python:Python 2.7版

  • Soaplib:soaplib 2.0.0-β2


  • 的Windows:Windows 7的SP1

  • 的Silverlight:Silverlight 4的

+3

如果您告訴我們您正在使用哪種Python和soaplib版本,這將有所幫助,因爲這是無效的2.7/0.8.1。編寫一個簡單的Python soap客戶端以查看它是否是導致延遲的Silverlight或Python也是有用的(我懷疑Silverlight(因爲我總是懷疑Silverlight))。 – msw 2011-06-02 10:45:17

+0

添加了關於python的信息,...我將嘗試編寫一個簡單的Python肥皂客戶端.. – Wolfy 2011-06-02 11:03:41

+0

我測試了ws,就像在helloworld示例中一樣...首先運行慢,然後快速運行...任何想法? – Wolfy 2011-06-02 11:10:59

回答

3

我建議使用wireshark http://www.wireshark.org/通過記錄('捕獲')設備可以看到的網絡流量的副本來'偵聽'發生在網絡上的對話。

當你開始捕獲時,數據量看起來很大,但如果你能發現任何看起來像你的SOAP消息的碎片(應該很容易發現),那麼你可以通過正確的方式快速過濾到該對話點擊並選擇'遵循TCP流'。

然後,您可以在彈出窗口中看到您編寫的SOAP服務與Silverlight客戶端之間的整個對話。

如果一切看起來不錯,然後關閉彈出窗口。作爲額外的獎勵,wireshark會將分段列表篩選出來,只是在交談中的那些分段列表中,其時間戳至於它們何時發生。使用它來查明是否客戶端或服務器的響應速度很慢。

如果似乎沒有真正的延遲,那麼我會建議讓Silverlight執行SOAP調用並實際進行網絡調用之間存在相當大的延遲。

+0

我會試試這個,讓你知道我發現了什麼。謝謝! – Wolfy 2011-06-09 07:09:44

+0

我用wireshark測試了它......似乎Silverlight中的問題要求做一個SOAP調用......現在我終於知道問題在哪裏了:) – Wolfy 2011-06-13 17:29:15

1

只是用suds客戶端和soaplib hello world例如一個粗略的基準:

>>> def bench_soap(num): 
...:  start = time.time() 
...:  for i in range(num): 
...:   hello_client.service.say_hello("Dave", 5) 
...:  elapsed = time.time() - start 
...:  print "Completed %s: ops in %.2f seconds : %.1f ops/sec" % (num, elapsed, num/elapsed) 
...:  
...:  

>>> bench_soap(100) 
Completed 100: ops in 0.40 seconds : 247.5 ops/sec 

>>> bench_soap(1000) 
Completed 1000: ops in 3.81 seconds : 262.5 ops/sec 

我還沒有看到任何「滯後」或類似於我的結果。 Soaplib,看起來很快並且響應迅速,所以也許是Silverlight問題?或者兩者之間存在某種不兼容?

+0

我嘗試多次撥打這項服務,但奇怪的是,這種慢響應不是恆定的... – Wolfy 2011-06-02 12:42:15