【问题标题】:Waiting time on server is large only in production服务器上的等待时间仅在生产中较长
【发布时间】:2015-09-15 18:48:51
【问题描述】:

我有一个文件控制器,负责以块(1 MB 块)处理上传的文件。我花时间在开发中对此进行了测试,一切都按预期进行。下面是一个动作的伪代码:

logger.Log("Getting InputStream");
var stream = Request.InputStream; // Here is the wait.
logger.Log("Got InputStream");
var bytes = GetByteArray(stream); // This is always less than 1 MB.
await FilesService.AppendToFileAsync(key, fileName, owner, bytes); // Write to the file.

// The GetByteArray method
private byte[] GetByteArray(Stream stream)
{
    var bytes = new byte[stream.Length];
    stream.Read(bytes, 0, bytes.Length);
    return bytes;
}

细节并不是很重要。我正在获取字节,然后将它们附加到磁盘上的文件中。

然而,在生产中,事情变得很奇怪。 这是上传(在生产中)一个块的请求时间表:

通过日志记录,我绝对知道所有的等待时间都花在了Request.InputStream 属性上。

等待时间在 1 分钟到 3 分钟之间。

我的问题

  • 这是否意味着服务器只花了那么多时间下载请求? (虽然我真的很怀疑)
  • 还是我在这里做错了什么?

还有一个小问题:Request sent 时间线是否告诉我内容字节何时完成接收?

我知道也许我应该编写一个文件上传处理程序或其他东西,但这真的有那么大的不同吗?

那么发生了什么事?

编辑:

当然,我研究了很多看似相关的问题,但都没有达到目标。

  • 我首先怀疑 appdomain 在每次块请求时都会被回收(因为我正在写入文件),但我从日志中确认不是这种情况。此外,由于等待在Request.InputStream 上,因此没有任何意义。

编辑 2:

我刚刚使用GetBufferlessInputStream 进行了测试,在同一操作中手动读取,结果是相同的。现在我确定等待是在读取请求流时。在这一点上,我感觉服务器在获取请求时就是那么慢。我联系了我的房东,他们说他们不限制速度,应该不会很慢。

为了确认这一点,这是我在上传块时的日志之一:

2015-09-15 23:23:12.6419|Entered upload chunk // This is the action.
2015-09-15 23:23:12.6419|Got bufferless stream // var s = Request.GetBufferlessStream()
2015-09-15 23:23:12.6419|Stream length: 1048576 (1 MB) // s.Length
2015-09-15 23:23:12.6419|Reading stream... // Here is the wait, this time it was not much (~26 secs) but it's still a lot.
2015-09-15 23:23:38.8211|Read stream of size 1048576 bytes (1 MB)

这就是我的阅读方式:

var b = new byte[s.Length];
var read = 0;
var c = 0;
while ((c = s.Read(b, read, b.Length - read)) != 0)
{
    read += c;
}

【问题讨论】:

  • 您的网络还有其他问题吗?病毒扫描或其他会使其成为外部问题(与您的代码没有直接关系)的东西?
  • @Igor 我持续测试这个问题超过几天,它似乎不是暂时的。病毒扫描等肯定是不可能的,因为就像我说的那样等待一直在获取Request.InputStream
  • 我能想到的唯一剩下的事情就是我做错了。也许小块上传和InputStream 的组合正在这样做。
  • @Igor 我 100% 确定问题不在 IO 部分。正如我所说,通过记录我确认等待完全在Request.InputStream。另请检查编辑。
  • 经过一番搜索,我想不出其他任何东西,所以我认为看看你在 GetByteArray 方法中使用 Request.InputStream 所做的事情可能仍然有用。你能发布你的 GetByteArray 方法的主体吗?

标签: asp.net-mvc jquery-file-upload iis-8.5


【解决方案1】:

您应该更改计划,该服务器上有大量站点 加入高级计划以提高下载速度

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    • 2023-04-11
    • 2018-06-03
    • 2019-06-04
    相关资源
    最近更新 更多