首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >等待网络是否会导致客户端超时?

等待网络是否会导致客户端超时?
EN

Stack Overflow用户
提问于 2014-07-31 19:35:04
回答 2查看 564关注 0票数 9

我有一个服务器,它正在执行Azure队列指示的工作。它几乎总是在非常高的CPU上并行执行多个任务,其中一些任务使用Parallel.ForEach。在任务运行期间,我通过使用await调用CloudQueue.AddMessageAsync来将分析事件写入另一个Azure队列。

我注意到数以千计的这些分析性写作失败,错误如下:

WebException: The remote server returned an error: (500) Internal Server Error.

我查看了Azure的存储事件日志,我有一堆不错的PutMessage命令,端到端需要80.000ms,但Azure本身只需要1ms。我得到的HTTP状态代码是500,Azure将原因描述为客户端超时。

我认为正在发生的事情是,我的代码调用AddMessageAsync,从那时起,我的线程被释放,网络驱动程序发送请求并等待响应。当获得响应时,网络驱动程序需要一个线程来获取响应,并调度一个任务来执行此操作,并调用我的continuation。因为我的服务器经常处于高负载状态,所以该任务需要很长时间才能获得线程,然后Azure服务器就会判定这是一个客户端超时。

调用azure的代码:

代码语言:javascript
复制
await cloudQueue.AddMessageAsync(new CloudQueueMessage(aMessageContent));

例外情况是:

代码语言:javascript
复制
StorageException: The remote server returned an error: (500) Internal Server Error.
Microsoft.WindowsAzure.Storage.Core.Executor.Executor.EndExecuteAsync[T](IAsyncResult result):11
Microsoft.WindowsAzure.Storage.Core.Util.AsyncExtensions+<>c__DisplayClass4.<CreateCallbackVoid>b__3(IAsyncResult ar):45
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task):82
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task):41
AzureCommon.Data.AsyncQueueDataContext+<AddMessage>d__d.MoveNext() in c:\BuildAgent\work\14078ab89161833\Azure\AzureCommon\Data\Async\AsyncQueueDataContext.cs:60
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task):82
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task):41
AzureCommon.Storage.AzureEvent+<DispatchAsync>d__1.MoveNext() in c:\BuildAgent\work\14078ab89161833\Azure\AzureCommon\Events\AzureEvent.cs:354

WebException: The remote server returned an error: (500) Internal Server Error.
System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult):41
Microsoft.WindowsAzure.Storage.Core.Executor.Executor.EndGetResponse[T](IAsyncResult getResponseResult):44

为什么会发生这样的事情,我说的对吗?如果是这样,对这个调用使用单线程同步上下文对我来说会更好吗?

Azure存储日志中的一行。您可以找到有关每个属性表示here的详细信息。

代码语言:javascript
复制
<request-start-time>            <operation-type>     <request-status>     <http-status-code>    <end-to-end-latency-in-ms>      <server-latency-in-ms>
2014-07-29T14:55:20.0794198Z    PutMessage           ClientTimeoutError   500                   86929                           1

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2014-08-07 02:04:31

错误500意味着服务器收到了错误的请求,或者由于各种其他原因而崩溃。我不认为这与线程的高负载有关。请考虑采取以下措施:

  • 检查您正在使用的队列的名称。名称需要小写,以字符开头。这是导致错误500的常见问题,并且没有来自服务器的激活错误消息。
  • 设置了Azure存储软件开发工具包客户端的重试策略,最好使用指数重试策略。
  • 确保你使用的是最新的Azure存储软件开发工具包,因为基础协议最近已更改为更有效的协议。
票数 0
EN

Stack Overflow用户

发布于 2014-11-14 12:33:28

'Bad Request' is a 400 error, not a 500 error。500错误表示任何类型的服务器错误,因此获得该响应是完全合理的,许多客户端库将使用500错误代码来处理类似类型的意外问题。

通常,“客户端超时”响应永远不会到达客户端(因为它超时了!)。我所能想到的客户端超时响应能够到达客户端的唯一情况是,如果请求超过一个网络数据包,并且客户端在发送第一个数据包之后发送数据包的速度太慢。这很容易由客户端设备上的CPU争用引起。我建议使用更高优先级的线程来监听网络响应,然后立即将响应的处理交给普通优先级的线程。CPU过载将导致各种超时问题,因为代码无法区分网络响应没有足够快到达还是CPU没有及时安排侦听器接收响应(甚至发送请求)。在这些情况下,即使是本地磁盘I/O和锁定也可能超时,这取决于底层实现。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25057888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档