В Mono провайдеры memcached вылетают через несколько часов с ошибкой "сокет не подключен" 500 - PullRequest
1 голос
/ 12 ноября 2010

Я пытаюсь настроить тестовый веб-сайт mono asp.net 4.0, который использует поставщиков memcached (http://memcachedproviders.codeplex.com/), используя Enyim.Memcached для доступа к memcached. Веб-сайт и memcachedproviders отлично работают на сервере Windows.

Я портировал работающий веб-сайт asp.net на моно (Ubuntu 10.10, Mono 2.8), и он работает правильно и получает сеансы с внешнего сервера, на котором запущен memcached, но по непонятным причинам каждые пару часов сбой веб-сайта, и просто возвращает ошибку 500, в которой говорится: «Сокет не подключен». Это происходит только при включенном состоянии сеанса memcachedproviders.

Есть ли у кого-нибудь опыт установки memcachedproveders для сеанса в моно, или знаете хотя бы, где мне следует начать поиск? Хотя я знаком с linux и apache, в целом мне удобнее работать с windows, поэтому, возможно, мне не хватает какой-то конфигурации.

Насколько я могу судить, это журнал от apache с момента возникновения ошибки, даже с включенной отладкой из mod_mono:

[Tue Nov 09 17:53:17 2010] [notice] caught SIGTERM, shutting down
[Tue Nov 09 17:53:19 2010] [notice] Apache/2.2.14 (Ubuntu) mod_mono/2.8 configured -- resuming normal operations
Listening on: /tmp/mod_mono_server_global
Root directory: /
Listening on: /tmp/mod_mono_server_global
Root directory: /
Error: There's already a server listening on /tmp/mod_mono_server_global
mod-mono-server4
mod-mono-server4
Listening on: /tmp/mod_mono_server_mysite
Root directory: /srv/www/mysite
[Tue Nov 09 17:53:58 2010] [error] (104)Connection reset by peer: read_data failed
[Tue Nov 09 17:53:58 2010] [error] Command stream corrupted, last command was -1

Общая конфигурация memcached в web.config выглядит примерно так:

<enyim.com>
    <memcached>
        <servers>
            <add address="##.##.##.##" port="11211"/>
        </servers>
        <socketPool minPoolSize="10" maxPoolSize="100" connectionTimeout="00:00:10" deadTimeout="00:02:00"/>
    </memcached>
</enyim.com>
...
<sessionState cookieless="false" regenerateExpiredSessionId="true" mode="Custom" customProvider="MemcachedSessionProvider">
    <providers>
        <add name="MemcachedSessionProvider" type="MemcachedProviders.Session.SessionStateProvider,MemcachedProviders" dbType="none" writeExceptionsToEventLog="true"/>
    </providers>
</sessionState>

И трассировка стека:

System.Net.Sockets.SocketException: The socket is not connected
  at System.Net.Sockets.Socket.Shutdown (SocketShutdown how) [0x00058] in /home/monoweb/mono-2.8/mcs/class/System/System.Net.Sockets/Socket_2_1.cs:698 
  at Enyim.Caching.Memcached.PooledSocket.Dispose (Boolean disposing) [0x00000] in <filename unknown>:0 
  at Enyim.Caching.Memcached.PooledSocket.Destroy () [0x00000] in <filename unknown>:0 
  at Enyim.Caching.Memcached.MemcachedNode+InternalPoolImpl.ReleaseSocket (Enyim.Caching.Memcached.PooledSocket socket) [0x00000] in <filename unknown>:0 
  at Enyim.Caching.Memcached.PooledSocket.Dispose (Boolean disposing) [0x00000] in <filename unknown>:0 
  at Enyim.Caching.Memcached.PooledSocket.System.IDisposable.Dispose () [0x00000] in <filename unknown>:0 
  at Enyim.Caching.Memcached.ItemOperation.Dispose () [0x00000] in <filename unknown>:0 
  at Enyim.Caching.Memcached.Operation.System.IDisposable.Dispose () [0x00000] in <filename unknown>:0 
  at Enyim.Caching.MemcachedClient.Store (Enyim.Caching.Memcached.ServerPool pool, StoreCommand mode, System.String key, System.Object value, UInt64 casValue, TimeSpan validFor, DateTime expiresAt) [0x00000] in <filename unknown>:0 
  at Enyim.Caching.MemcachedClient.Store (StoreMode mode, System.String key, System.Object value, TimeSpan validFor) [0x00000] in <filename unknown>:0 
  at MemcachedProviders.Session.SessionStateProvider.SetAndReleaseItemExclusive (System.Web.HttpContext context, System.String id, System.Web.SessionState.SessionStateStoreData item, System.Object lockId, Boolean newItem) [0x00000] in <filename unknown>:0 
  at System.Web.SessionState.SessionStateModule.OnReleaseRequestState (System.Object o, System.EventArgs args) [0x0003f] in /home/monoweb/mono-2.8/mcs/class/System.Web/System.Web.SessionState_2.0/SessionStateModule.cs:292 
  at System.Web.HttpApplication+<RunHooks>c__Iterator1.MoveNext () [0x001aa] in /home/monoweb/mono-2.8/mcs/class/System.Web/System.Web/HttpApplication.cs:1026 
  at System.Web.HttpApplication+<Pipeline>c__Iterator2.MoveNext () [0x00ec9] in /home/monoweb/mono-2.8/mcs/class/System.Web/System.Web/HttpApplication.cs:1385 
  at System.Web.HttpApplication.Tick () [0x00000] in /home/monoweb/mono-2.8/mcs/class/System.Web/System.Web/HttpApplication.cs:914 

1 Ответ

2 голосов
/ 17 ноября 2010

Я решил исправить это, сначала загрузив исходный код memcachedproviders и перекомпилировав его для ссылки на enyim.memcached 2.7 (последняя версия).Это повлекло за собой некоторые незначительные изменения.

После этого в моно я вместо этого получил другую ошибку, в пределах enyim memcached относительно string.IndexOfAny (http://msdn.microsoft.com/en-us/library/11w09h50.aspx), где проверяемая строка была нулевой, и так былобросить исключение.Если я правильно читаю документы, я думаю, что он должен генерировать исключение, только если параметр имеет значение null, а не если строка.Либо это, либо mod_mono случайным образом пытается получить доступ к сеансу [null], тогда как asp.net - нет.

Чтобы это исправить, я загрузил исходный код enyim memcached и добавил проверку, которая заменит пустое значение пустой строкой.до вызова функции.Сессии memcached работают без перебоев более 24 часов.

...