Производительность удаленного взаимодействия со временем снижается - PullRequest
6 голосов
/ 02 декабря 2008

Я работаю над клиент-серверным решением, которое использует .NET 2.0 Remoting (активация сервера, двоичное форматирование по каналу TCP, Vista Ultimate) для коммуникационных целей. В настоящее время я профилирую приложение и запускаю все на одной машине. Я заметил, что если я запускаю приложение, все отлично работает в течение нескольких минут, а затем внезапно каждый удаленный вызов занимает несколько секунд. У меня логирование на обоих концах и часы каждого звонка. Реализация на стороне сервера выполняется всего за долю секунды, тогда как весь удаленный вызов медленный. Дальнейшее профилирование показало, что удаленное взаимодействие ухудшается на стороне сервера: хотя внутренняя работа удаленной службы выполняется в течение доли секунды, ответы очень медленные. Если я перезагружаю сервер, все снова возвращается в нормальное состояние на несколько минут.

Кто-нибудь испытывал что-то подобное?

Спасибо!

UPDATE: Я проверил, если я настрою время жизни моего удаленного объекта, скажем, 1 день, у меня все еще будет та же проблема.

UPDATE: Я использую шаблон, предложенный Ingo Ramer ( HOWTO: Используйте интерфейсные удаленные объекты с файлами конфигурации ) для всех моих удаленных действий, если это имеет какое-то значение.

Код клиента:

public static object CreateInstance(Type type)
{
    if (!Initialized)
        InitWellKnownTypesCache();

    WellKnownClientTypeEntry typeEntry = (WellKnownClientTypeEntry)wellKnownTypesCache[type];
    if (null == typeEntry)
        throw new RemotingException("Type not found.");

    if (string.IsNullOrEmpty(serverObjectActivationUri))
        throw new RemotingException("ServerObjectActivationUri wasn't configured. Cannot create server object instance.");

    return Activator.GetObject(typeEntry.ObjectType, string.Format(serverObjectActivationUri, typeEntry.ObjectUrl));
}

На стороне сервера нет ничего, кроме правильного конфигурационного файла, который выглядит следующим образом:

        <service>
            <wellknown 
                mode="Singleton" 
                type="MyDomain.SomeDomain, MyDomain" 
                objectUri="SomeDomainService"
            />

Я ничего не делаю, кроме RemotingConfiguration.Configure («MyDomainService.exe.config», false); ни в моем сервере, ни в коде клиента.

Ответы [ 8 ]

1 голос
/ 03 декабря 2008

Используйте какой-либо инструмент мониторинга сети, например Wireshark , чтобы проверить, связана ли ваша проблема с сетью или синхронизацией с сервером.

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

0 голосов
/ 07 декабря 2008

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

Это, вероятно, не ваша проблема, но я сталкивался с этим раньше, поэтому я подумал, что передам это.

0 голосов
/ 05 декабря 2008

Можете ли вы попробовать атрибут MTAThread для вашего класса, просто мысль ..

0 голосов
/ 05 декабря 2008

Это может быть связано с пожизненной арендой. Объект Singleton подлежит пожизненной аренде, которая была указана для него, поэтому он может быть переработан, даже если клиенты в настоящее время хранят ссылки на него. Вы можете создать прежний тип объекта Singleton, переопределив метод InitializeLifetimeService объекта MarshalByRefObject.

0 голосов
/ 03 декабря 2008

Я изменил тип канала удаленного взаимодействия с tcp на http, оставив двоичное форматирование. Я вижу такое же замедление в течение нескольких минут бездействия, но в отличие от каналов tcp, после того, как клиент делает «медленный» удаленный вызов, сервер «просыпается» и все последующие вызовы происходят быстро, пока не наступит следующий период бездействия и сервер снова засыпает.

Ни в коем случае это не решение, но по крайней мере какое-то обходное решение.

0 голосов
/ 03 декабря 2008

Вы спонсируете свои удаленные объекты со спонсором клиента?

0 голосов
/ 03 декабря 2008

Также поможет просмотр вашего кода или его подмножества.

0 голосов
/ 02 декабря 2008

Никогда. Вы делаете что-то, что приводит к тому, что дополнительные экземпляры вашего удаленного слоя будут зарегистрированы / созданы ??

...