Как работает _IOCompletionCallback?
От: LWhisper  
Дата: 11.10.17 16:56
Оценка:
Всем привет!

При работе с сетевыми интерфейсами, например, посредством TcpListener, при помощи старых добрых Begin/End AcceptTcpClient, формируется довольно подозрительный стек:

System.Threading.WaitHandle.InternalWaitOne(System.Runtime.InteropServices.SafeHandle, Int64, Boolean, Boolean)
System.Threading.WaitHandle.WaitOne(Int32, Boolean)

MyListener..OnAcceptConnection(System.IAsyncResult)

System.Net.LazyAsyncResult.Complete(IntPtr)
System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
System.Net.ContextAwareResult.Complete(IntPtr)
System.Net.LazyAsyncResult.ProtectedInvokeCallback(System.Object, IntPtr)
System.Net.Sockets.BaseOverlappedAsyncResult.CompletionPortCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)
System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)
GCFrame
DebuggerU2MCatchHandlerFrame


Смущает именно PerformIOCompletionCallback.
Значит ли это, что весь оставшийся код так же будет выполнен в IOCP-треде, которых в системе не густо, и я смачно выстрелю себе в ногу этим вот WaitOne?
.net networking iocp socket async
Re: Как работает _IOCompletionCallback?
От: _Raz_  
Дата: 11.10.17 18:01
Оценка:
Здравствуйте, LWhisper, Вы писали:

LW>Смущает именно PerformIOCompletionCallback.

LW>Значит ли это, что весь оставшийся код так же будет выполнен в IOCP-треде, которых в системе не густо, и я смачно выстрелю себе в ногу этим вот WaitOne?

There Is No Thread
... << RSDN@Home 1.3.108 alpha 5 rev. 56>>
Re[2]: Как работает _IOCompletionCallback?
От: LWhisper  
Дата: 12.10.17 09:27
Оценка:
Здравствуйте, _Raz_, Вы писали:

_R_>There Is No Thread

Ты дал неверный ответ. Я не спрашиваю, как работает IOCP, это понятно. Мой вопрос касается исключительно _IOCompletionCallback в реалиях .NET. И там как раз есть вполне себе живой тред. И у меня лишь вопрос — из какой он группы. Из дефолтного пула, который можно попридержать или из пула, который разгребает IOCP?
Re: Как работает _IOCompletionCallback?
От: Sharov Россия  
Дата: 12.10.17 11:34
Оценка: +2
Здравствуйте, LWhisper, Вы писали:

LW>Всем привет!


LW>При работе с сетевыми интерфейсами, например, посредством TcpListener, при помощи старых добрых Begin/End AcceptTcpClient, формируется довольно подозрительный стек:


LW>
LW>System.Threading.WaitHandle.InternalWaitOne(System.Runtime.InteropServices.SafeHandle, Int64, Boolean, Boolean)
LW>System.Threading.WaitHandle.WaitOne(Int32, Boolean)

LW>MyListener..OnAcceptConnection(System.IAsyncResult)

LW>System.Net.LazyAsyncResult.Complete(IntPtr)
LW>System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
LW>System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
LW>System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
LW>System.Net.ContextAwareResult.Complete(IntPtr)
LW>System.Net.LazyAsyncResult.ProtectedInvokeCallback(System.Object, IntPtr)
LW>System.Net.Sockets.BaseOverlappedAsyncResult.CompletionPortCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)
LW>System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)
LW>GCFrame
LW>DebuggerU2MCatchHandlerFrame
LW>


LW>Смущает именно PerformIOCompletionCallback.

LW>Значит ли это, что весь оставшийся код так же будет выполнен в IOCP-треде, которых в системе не густо, и я смачно выстрелю себе в ногу этим вот WaitOne?

Тут неплохо объясняется -- почитайте все ответы. Вроде пишут, что по мере необходимости среда (runtime-->ОС) будут создавать
еще IOCP потоки, но вообще с любым пульным потоком WaitOne не лучшая идея.
Кодом людям нужно помогать!
Re[2]: Как работает _IOCompletionCallback?
От: LWhisper  
Дата: 12.10.17 14:07
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Тут неплохо объясняется -- почитайте все ответы. Вроде пишут, что по мере необходимости среда (runtime-->ОС) будут создавать

S>еще IOCP потоки, но вообще с любым пульным потоком WaitOne не лучшая идея.
Судя по WinDBG, действительно IOCP'ые. В дампе висят 800/800. До лимита не добрались, но каждое создание нового потока занимает время.
Re[3]: Как работает _IOCompletionCallback?
От: Sharov Россия  
Дата: 12.10.17 14:18
Оценка:
Здравствуйте, LWhisper, Вы писали:

LW>Судя по WinDBG, действительно IOCP'ые. В дампе висят 800/800. До лимита не добрались, но каждое создание нового потока занимает время.


Ну да, т.е. действительно блокировки там устраивать не очень, получил\передал и не более.
Кодом людям нужно помогать!
Re[3]: Как работает _IOCompletionCallback?
От: User239 Россия  
Дата: 17.10.17 18:06
Оценка:
Здравствуйте, LWhisper, Вы писали:

LW>Ты дал неверный ответ. Я не спрашиваю, как работает IOCP, это понятно. Мой вопрос касается исключительно _IOCompletionCallback в реалиях .NET. И там как раз есть вполне себе живой тред. И у меня лишь вопрос — из какой он группы. Из дефолтного пула, который можно попридержать или из пула, который разгребает IOCP?


Из независимого пула. ThreadPool.SetMinThreads позволяет установить minThreads для обоих пулов. То есть чтобы быстро создавались IOCompletion потоки, нужно увеличить второй параметр.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.