Мы наблюдаем периодическую проблему на некоторых наших производственных серверах. Под прерывистым я имею в виду, что в настоящее время это влияет на менее чем 1% от общего числа выполняемых нами работ и отображается только на 2 из наших ~ 20 серверов (где мы это заметили, по крайней мере).
Наша установка такова:
У нас есть специальное программное обеспечение, которое представляет собой измененную версию старого кода VB6 и C # .net. Программа представляет собой движок для создания собственных сценариев. Программа выполняется в парке серверов, где каждый сервер запускает 50-150 экземпляров одновременно, каждый со своим индивидуальным сценарием.
Что происходит, так это то, что через некоторое время после начальной загрузки программа в вопросах попытается связаться с веб-сервисом, чтобы получить набор настроек. Время от времени мы получаем эту проблему:
System.IO.FileNotFoundException:
Could not find file 'C:\Documents and Settings\ccrun\Local Settings\Temp\driumfrd.dll'. File name: 'C:\Documents and Settings\ccrun\Local Settings\Temp\driumfrd.dll'
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
at Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch(CompilerParameters options, String[] fileNames)
at Microsoft.CSharp.CSharpCodeGenerator.FromSourceBatch(CompilerParameters options, String[] sources)
at Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromSourceBatch(CompilerParameters options, String[] sources)
...
После этого будет достигнут наш предел регистрации. Имя .dll отличается при каждом выполнении. Это 2 уровня косвенного обращения от кода VB6, так что я вполне уверен, что это чисто C # проблема
До сих пор я смог найти в Google то, что это связано с динамической компиляцией клиентского кода веб-службы. Мой гугл-фу останавливается на том, чтобы выяснить, почему мы не получаем эту ошибку все время. Разрешения не могут быть неправильными, так как не все задания терпят неудачу. Точно такая же работа будет выполнена без ошибок при перезапуске на том же сервере.
Единственный индикатор, который мы смогли различить, - это то, что задания обычно терпят неудачу в кластерах, где большинство, но не все задания, запущенные в одно и то же время (и на одном и том же сервере), потерпят неудачу. Кроме этого, у нас нет ничего хорошего, чтобы пройти здесь.
Лучшая ссылка, которую я нашел на данный момент, такова:
http://social.msdn.microsoft.com/Forums/en-US/asmxandxml/thread/d7ea81e7-8fea-4056-ad21-f2fee1887bcc
Edit:
Это очень странно, после некоторых дополнительных исследований я заметил, что сообщения об ошибках в наших журналах имели неправильный код ошибки.
public entry_function()
{
try
{
do stuff..
main_function();
}
catch (Exception exp)
{
// General error
_log.EventID = 57051;
_log.WriteToErrorLog(Log.Level.ERROR, "Unhandled exception", exp);
}
}
public main_function()
{
do more stuff...
helper function();
}
public helperfunction()
{
try
{
switch()
{
...
case WebServices.WSMarkAsInvalid:
{
// Info logger
_log.EventID = 57114;
_log.WriteToInfoLog(Log.Level.INFO, "Call WSMarkAsInvalid start");
new WSSystem.WSSystem().WSSystemMarkAsInvalid((string)parameters[0], (string)parameters[1], (int)parameters[2]);
// Info logger
_log.EventID = 57115;
_log.WriteToInfoLog(Log.Level.INFO, "Call WSMarkAsInvalid end");
return null;
}
}
}
catch(Exception exp)
{
_log.EventID = 57120;
_log.WriteToErrorLog(Log.Level.WARN, "Error communicating with webservice", exp);
}
}
Игнорируя очевидные биты псевдокода, я вижу 4 случая, когда за 57114 следует предупреждение 57120, и 39 случаев, когда за 57114 следует 57051!
Здесь я в полном недоумении, насколько я могу судить, внутренняя попытка / улов не будет достигнута, несмотря на совпадение с «любым» исключением.