Проблема с медленным веб-сервисом

#python #windows #linux #web-services #silverlight-4.0

#python #Windows #linux #веб-сервисы #silverlight-4.0

Вопрос:

Я создаю веб-сервис Python на компьютере Linux (Ubuntu):

 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.Resu<
    DG.Visibility = System.Windows.Visibility.Visible;
}
  

Моя проблема в том, что когда я перехожу на эту страницу, получение данных из ws (ws в локальной сети) занимает 4-8 секунд.

Я действительно сомневаюсь, что пропускная способность линии может создать это время ожидания…

Мой вопрос: Есть ли у вас какие-либо предложения, что я могу сделать, чтобы ускорить это?

Информация о системе:

  • UbuntuServer 11.04

  • Python: Python 2.7

  • Soaplib: soaplib 2.0.0-beta2


  • Windows: Windows 7 sp1

  • Silverlight: Silverlight 4

Комментарии:

1. Было бы полезно, если бы вы сообщили нам, какие версии Python и soaplib вы используете, поскольку это недопустимо 2.7 / 0.8.1. Также было бы полезно написать тривиальный клиент soap на Python, чтобы узнать, является ли Silverlight или Python причиной задержки (я подозреваю Silverlight (потому что я всегда подозреваю Silverlight)).

2. добавлена информация о python,… Я попытаюсь написать тривиальный клиент soap на Python..

3. Я тестировал ws, как в примере с helloworld … сначала запускаю работу медленно, затем работает быстро … есть идеи?

Ответ №1:

Я бы рекомендовал использовать wireshark http://www.wireshark.org / для «прослушивания» разговоров, происходящих по сети, путем записи («захвата») копий сетевого трафика, которые может видеть устройство.

Когда вы начинаете захват, объем данных может показаться огромным, но если вы можете обнаружить какие-либо фрагменты, похожие на ваше сообщение SOAP (их должно быть легко обнаружить), тогда вы можете быстро отфильтровать только этот диалог, щелкнув правой кнопкой мыши и выбрав «Следовать потоку TCP».

Затем вы можете увидеть весь диалог между написанным вами сервисом SOAP и клиентом silverlight во всплывающем окне.

Если все выглядит нормально, закройте всплывающее окно. В качестве дополнительного бонуса wireshark отфильтрует список фрагментов только для тех, которые присутствуют в диалоге, с временными метками относительно того, когда они произошли. Используйте это, чтобы выяснить, клиент это или сервер, который медленно отвечает.

Если кажется, что реальной задержки нет, то я бы предположил, что существует значительное отставание между запросом Silverlight выполнить вызов SOAP и фактическим выполнением сетевого вызова.

Комментарии:

1. Я попробую это и дам вам знать, что я выясню. Спасибо!

2. Я тестировал это с помощью wireshark… Похоже, что проблема в Silverlight с просьбой выполнить вызов SOAP… теперь я, наконец, знаю, в чем проблема 🙂

Ответ №2:

Просто беглый тест с использованием клиента 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? Или какая-то несовместимость между ними?

Комментарии:

1. Я пытался вызвать эту службу много раз, но странно то, что этот медленный ответ не является постоянным…