代码之家  ›  专栏  ›  技术社区  ›  redcalx

序列化性能差的可能解决方案

  •  14
  • redcalx  · 技术社区  · 15 年前

    最近,我使用进程外会话状态对ASP.NET应用程序进行了一些性能测试和分析—在web服务器场上使用会话状态时,这是必要的,以便可以在任何web服务器上检索状态,例如,如果后续HTTP请求到达另一台服务器,因为会话不“粘滞”,或者原始服务器关闭,等等。

    令我惊讶的是,当我满负荷运行web服务器并分析CPU使用情况时,99%的CPU时间都花在序列化和反序列化会话状态上。随后,我们实现了一个定制的“缓存”状态服务器;这通常会序列化状态,但也会将状态保留在内存中,这样,如果使用粘性会话,则大多数情况下不必反序列化状态。这将服务器吞吐量提高了2倍;但是,序列化仍然占CPU时间的98%或更多。

    继续调查,我们为一些类编写了定制的序列化例程,而不是依赖.Net的内置序列化。我们发现,性能非常好 ,以大约 50倍 . 似乎大部分CPU负载是由内置的.Net序列化引起的,而内置的.Net序列化由于依赖于使用反射来遍历对象指针/图形和提取字段数据而变得缓慢。

    将我们的性能提高50倍是非常诱人的,从而将web服务器的硬件需求降低了一个很大的因素(而电源需求则降低了一个较小但仍然很重要的因素)。目前的选择是:

    1) 编写自定义序列化。这是一个问题,因为任务的复杂性及其产生的维护开销,也就是说,对类状态的任何更改都需要对序列化/反序列化例程进行更改。

    我很想知道是否有人知道第三方解决方案,或者是否遇到过这个问题,因为我在互联网搜索中没有发现任何关于它的提及。

    更新:

    5 回复  |  直到 13 年前
        1
  •  2
  •   Robert    15 年前

    但它只做你想做的,所以它会尽可能快。

    祝你好运

        2
  •  1
  •   Matt    15 年前

    另一个选项是在服务器端回发上未触及的所有控件上主动禁用ViewState。

        3
  •  1
  •   Brian    15 年前

    ISerializable . 如果你对最坏的违规者这样做,你将不会增加太多的维护,但仍然会得到一些加速。

        4
  •  1
  •   Peter Mortensen TravisEz13    7 年前

    Simon Hewitt的优秀开源库,请参见 Optimizing Serialization in .NET - part 2 .

    我是 using it in my application

    它消除了导致故障的反射 一些更聪明的东西可以让这一切自动化。无论如何都是这样 好处。

        5
  •  0
  •   Hugh Moran    15 年前

    我们遇到了类似的问题,并设计了几种提高性能的方法。我们在Persistore内存映射产品(目前为beta版)中使用了其中一些。在我们的例子中,我们可以简单地“就地”访问持久化数据,因为它总是在内存映射的堆中。

    然而,一个“技巧”是将会话状态数据(如果可能)定义为 编组的 类/结构和“序列化”,使用.NET封送处理支持,这确实可以非常快,但不会处理“对象”图。

    ,据我所知,这是第一次。

    如果有人好奇,请与我们联系,获取产品的最新信息。

    附言:网站已经过时了,产品远远超出了上面的描述。