由于网络导致的性能问题

Posted

技术标签:

【中文标题】由于网络导致的性能问题【英文标题】:Performance Issue due to Network 【发布时间】:2013-04-04 19:18:20 【问题描述】:

我目前正在处理一个具有大型数据集的 .NET (3.5) 页面,性能是坐在 2 个不同位置(相隔 12 小时)的用户的主要关注点。

目标和要求:

    我有一个大约 2500 条记录 x 30 列的结果集。 显示为带有客户端排序和大量单元格格式的表格视图。 在相隔 12 小时的两个不同位置加载时间相当快(一个位于网络浏览器旁边,另一个位于地球另一端的网络服务器)。

我尝试了 2 种不同的方法,但无法满足两个用户。到目前为止,这是我尝试过的:

客户端网格 优点: 通过线路发送的较小数据包; Web 服务器正在发送 缺点: 生成网格的 javascript/JQuery 过程需要 10 到 15 秒(不定)。

总结:客户端网格有利于远离网络服务器距离的用户。但是,对于坐在服务器旁边的用户而言,情况并非如此。现在坐在服务器旁边的用户将不得不坐下来等待 JQuery/Javascript 构建表。

服务器端网格 优点: 在 Web 服务器(服务器端)上完成大多数标记(如果不是全部标记)的渲染速度更快。 缺点: 通过线路发送的大数据包; Web 服务器正在发送 3.5 - 5 MB。通过网络慢得多。 (检索 3.7 MB 的页面大约需要 30 多秒)

总结:服务器端网格对坐在旁边网络服务器的用户很有帮助(因为它几乎是瞬时加载的——3 MB 的空间只需 1 秒)。同样,对于坐在地球另一端的用户来说,网络传输会受到影响 - 3.MB 页面需要 30 多秒。

经过谷歌搜索和实验;对于如何让这两个用户都满意,我仍然摸不着头脑。

*注意:我决定不包含任何源代码,因为它不会以任何可能的方式帮助您。

我知道没有一种适合所有解决方案的解决方案,但我正在寻找至少能够满足这两个用户的中间立场的解决方案。

一般来说,至少,我想给用户一个页面已经“加载”(快速)的印象——在所有数据到达之前开始渲染;尽管它可能仍在加载数据。 IE。也许无限滚动。

我正在寻找创意;因此,如果您的建议包括将服务器移动到全球的一半;增加您的带宽或任何其他牵强的想法;如果您对自己的想法保密,我将不胜感激。

谢谢。

D

【问题讨论】:

【参考方案1】:

我已经成功地将DhtmlX Grid 用于此用途。它既有无限滚动的能力,也有分页的能力。仅请求页面/可见滚动区域上显示的数据(减少在任何给定时间通过网络发送的数据量。它也非常可定制,并且具有许多您可能会发现有用的其他功能。

【讨论】:

感谢您的建议。我的网格需要显示 29 列,几乎每一列都有某种格式(背景颜色、文本颜色、超链接等)。因此,在我尝试之前;我可以问一下 DHTMLX Grid 收到数据后需要多长时间才能呈现。我目前正在使用 DataTables(datatable.net),根据数据的大小,渲染几乎需要 6-15 秒。我还实现了“延迟渲染选项”,其中仅渲染屏幕上可见的行。对于 DataTables,它是导致问题的初始呈现。 根据我们的经验,网格的渲染时间不到一秒。我们经常有 > 20 列。我们同时利用了无限滚动和分页,因此需要渲染的网格量并没有那么大。显示的大多数数据集都大于 1000 行(最多 10,000 行,尽管您将如何处理该数量的数据是有问题的)。如果您最初只加载数据子集,为什么渲染需要这么长时间? 我不确定这是否是 DataTables 插件(作为一个整体)的问题,或者问题在于它的使用方式。我根本没有对 DataTables 使用分页(而是使用 DeferRender ~ 仅在行进入视图时才呈现该行)。我建议使用服务器端分页作为解决此性能问题的最终且唯一的解决方案。分页似乎将性能问题缓解到两个位置的可接受时间范围(并且可能是唯一可行的选择)。不过感谢您的建议。【参考方案2】:
    您可以在网格上使用server side paging 并且只需加载 10 个条目 每页 如果用户需要,您可以提供“下载为 pdf”文件选项 查看整个网格

您可以进一步使用客户端网格和服务器端分页来缩短访问时间。我认为带有服务器端分页的gridview 就可以了。如果您需要一次显示所有记录,那么这是一个单独的问题。

【讨论】:

我们已经探索了使用服务器端分页的想法;我们关心的是排序(多排序)的性能。我已经用 DataTables (datatables.net - Client Side Grid) 构建了一个,性能对于远处的机器来说非常好。 [从头开始构建网格的 JSON 数据的网络传输 + javascript 比将完整的服务器端网格发送到地球另一端的客户端机器的网络延迟要快得多;不幸的是,本地用户没有网络延迟,并且 javascript 处理增加了开销]。最好显示所有记录;分页是最后的选择。谢谢 服务器端分页。这是我最后也是最后的选择。 @SolidSnake 您可以使用进度指示器来进一步方便用户。【参考方案3】:

服务器端分页?

您说创意,那么您是否打开了 gzip 来压缩您发送的数据?另外,尝试缩小 html?

【讨论】:

我考虑过服务器端分页;但是我忘了提到所需的功能之一(多列排序)。从理论上讲,这可能会导致性能问题。因为每种排序都会调用回发;按第 1 列对整个数据进行排序,然后按第 2 列排序。记录数也各不相同,可能还会再增长 1,000 条。我们目前正在使用 WAN Scaler 来压缩两点之间的数据传输。我将探索和测试分页解决方案,看看性能如何。谢谢。

以上是关于由于网络导致的性能问题的主要内容,如果未能解决你的问题,请参考以下文章

linux系统优化

XAF-由于try catch导致的性能问题一例

大白话详解5种网络IO模型

iperf网络新能评估

性能测试-网络调优

系统架构性能问题诊断及优化思路