今日、私のIISサイトはhign cpuを使用していて、私のサーバーは非常に遅かったです!そして、タスクマネージャからダンプを取得し、IISResetを実行すると、質問が解決されました。
windbgでは、!runawayを使用して、長時間実行されたスレッドを検索します。たとえば、ここに画像の説明を入力します。
そして、!clrstackを使用して、上位10個のスレッドが次のコードを実行していたことを確認します:System.Random.NextBytes(Byte []))、次のようになります。
Thread 30
Current frame: (MethodDesc 00007ffb5252c418 +0x20 System.Random.InternalSample())
Child-SP RetAddr Caller, Callee
000000487470b460 00007ffb531d8138 (MethodDesc 00007ffb5252c458 +0x28 System.Random.NextBytes(Byte[]))
000000487470b4b0 00007ffaffafe87a (MethodDesc 00007ffafeeb4e20 +0x4a Pinpoint.Core.Util.SpanIdUtil.GetNewSpanId())
000000487470b4e0 00007ffb014a53fb (MethodDesc 00007ffafeeb4e30 +0x1b Pinpoint.Core.Util.SpanIdUtil.GetNextSpanId(Int64, Int64))
000000487470b520 00007ffb014a5370 (MethodDesc 00007ffafeeb4150 +0x30 Pinpoint.Core.TraceId.GetNextTraceId())
000000487470b5a0 00007ffaffae4dab (MethodDesc 00007ffaff317ed0 +0x1cb Mike.Pinpoint.Plugin.WebRequestPlugins.TraceHttpWebRequest.BeforeGetResponse(System.Net.HttpWebRequest))
000000487470bbb0 00007ffb529444e0 (MethodDesc 00007ffb52535888 +0x80 System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(System.Object, System.Object[], System.Object[]))
000000487470bcf0 00007ffb529444e0 (MethodDesc 00007ffb52535888 +0x80 System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(System.Object, System.Object[], System.Object[]))
000000487470bd60 00007ffb5292f4ee (MethodDesc 00007ffb52535870 +0x8e System.Reflection.RuntimeMethodInfo.Invoke(System.Object, System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo))
000000487470bde0 00007ffaffae4b79 (MethodDesc 00007ffaff318238 +0x99 Mike.Pinpoint.Plugin.WebRequestPlugins.TraceFilterImpl.BeforeGetResponseForFilter(System.Net.HttpWebRequest))
000000487470bdf0 00007ffb528f93e0 (MethodDesc 00007ffb526b1270 +0x120 System.IO.StreamWriter.Dispose(Boolean))
そして、これが私の元のコードです:
using System;
namespace Pinpoint.Core.Util
{
public class SpanIdUtil
{
private static readonly Random rnd = new Random(Environment.TickCount);
public const long Null = -1;
public static long GetNewSpanId()
{
byte[] buf = new byte[8];
rnd.NextBytes(buf);
long newId = BitConverter.ToInt64(buf, 0);
return newId;
}
public static long GetNextSpanId(long spanId, long parentSpanId)
{
long newId = GetNewSpanId();
while (newId == spanId || newId == parentSpanId)
{
newId = GetNewSpanId();
}
return newId;
}
}
}
誰かが私にこのエラーの原因を教えてもらえますか?これは1回だけ発生したことに注意してください。
Random
スレッド間で同じインスタンスを共有しているため、ここで説明するようにランダムクラス内で問題が発生し、ゼロを返すことができなくなる可能性があります。ランダムはスレッドセーフではありません。
個人的には、サーバーアプリでは、カウントダウンしてゼロになると例外をスローするガードなしでwhileループを使用することは決してありません。ループが終了することを(数学的に)証明できない限り、サーバーアプリではループが終了すると、スレッドが永久に失われるため、ループがスタックしないように注意する必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加