服务器应用程序中的并行处理
Parallel processing in server applications
由于服务器端应用程序的工作是由服务器完成的,并且它还需要服务于其他请求,我想知道在服务器端应用程序中使用并行处理是否有任何真正的好处?在我看来,我认为使用并行处理通常是不好的?关注 CPU power 只解决部分问题,其他请求无法获取服务器?
如果说有优势的话,我想只有在具体条件是肉的情况下才应该考虑。那么,关于何时在服务器应用程序中使用并行 class 有哪些好的指导原则?
您正在平衡两个问题:对给定用户的快速响应,以及支持所有希望在给定时间段内连接到服务器的用户。
在考虑为给定用户进行更快计算的并行性之前,请考虑预计算和缓存是否可以满足您的性能要求。进行热点分析,看看是否有机会优化现有代码。
如果您的部署硬件是给定的,请观察高峰时段的 CPU 负载。如果 CPU 很忙(经验法则是 70% 以上的利用率),并行计算将对这两个问题都不利。如果 CPU 负载不重,您可能会缩短给定用户的响应时间,而不会影响服务器一次可以处理的用户数量(确定为基准)。
如果您没有达到您的单用户性能目标并且已经用尽了预计算和缓存的选项(并且已经分析了性能热点并且看不到优化的机会),您总是可以并行化适合自己的工作负载并行计算,如果你愿意根据需要升级你的服务器,这样在高峰期你就不会过度征税 CPU.
与大多数与性能相关的问题一样:它取决于很多因素。像这样的东西:
- 您是否经常有大量请求同时访问您的服务器?
- 有多少典型请求的周转时间花在等待 I/O 上,而不是实际执行 CPU?
- 您能否在负载平衡器后面放置多个服务器代码实例?
- 您正在查看的操作通过并行化得到优化的程度如何?
- 对于您正在执行的操作 return 比没有并行性更快地回答用户有多重要?
根据我的经验,典型请求的大部分时间都花在等待数据库查询和 REST API 调用完成或从磁盘加载文件等事情上。这些不是 CPU 密集型操作,因为它们可以 并发 通常可以通过简单地以并发方式编排异步 Task
来完成,不一定使用并行线程。
同样根据我的经验,大多数使用 TPL 来提高算法性能的尝试最终只会产生边际性能改进,而其他方法(如使用更合适的数据结构、缓存等)通常会产生改进数量级。
当然,如果您的应用程序一开始就不会太慢以满足您的需求,那么任何优化都将被视为过早优化,您希望避免这种情况。
但是,如果您出于某种原因发现自己在执行一个对并行性反应良好的 CPU 密集型操作,在您的代码的一部分绝对必须比当前执行得更快,那么并行处理是一个不错的选择。
由于服务器端应用程序的工作是由服务器完成的,并且它还需要服务于其他请求,我想知道在服务器端应用程序中使用并行处理是否有任何真正的好处?在我看来,我认为使用并行处理通常是不好的?关注 CPU power 只解决部分问题,其他请求无法获取服务器?
如果说有优势的话,我想只有在具体条件是肉的情况下才应该考虑。那么,关于何时在服务器应用程序中使用并行 class 有哪些好的指导原则?
您正在平衡两个问题:对给定用户的快速响应,以及支持所有希望在给定时间段内连接到服务器的用户。
在考虑为给定用户进行更快计算的并行性之前,请考虑预计算和缓存是否可以满足您的性能要求。进行热点分析,看看是否有机会优化现有代码。
如果您的部署硬件是给定的,请观察高峰时段的 CPU 负载。如果 CPU 很忙(经验法则是 70% 以上的利用率),并行计算将对这两个问题都不利。如果 CPU 负载不重,您可能会缩短给定用户的响应时间,而不会影响服务器一次可以处理的用户数量(确定为基准)。
如果您没有达到您的单用户性能目标并且已经用尽了预计算和缓存的选项(并且已经分析了性能热点并且看不到优化的机会),您总是可以并行化适合自己的工作负载并行计算,如果你愿意根据需要升级你的服务器,这样在高峰期你就不会过度征税 CPU.
与大多数与性能相关的问题一样:它取决于很多因素。像这样的东西:
- 您是否经常有大量请求同时访问您的服务器?
- 有多少典型请求的周转时间花在等待 I/O 上,而不是实际执行 CPU?
- 您能否在负载平衡器后面放置多个服务器代码实例?
- 您正在查看的操作通过并行化得到优化的程度如何?
- 对于您正在执行的操作 return 比没有并行性更快地回答用户有多重要?
根据我的经验,典型请求的大部分时间都花在等待数据库查询和 REST API 调用完成或从磁盘加载文件等事情上。这些不是 CPU 密集型操作,因为它们可以 并发 通常可以通过简单地以并发方式编排异步 Task
来完成,不一定使用并行线程。
同样根据我的经验,大多数使用 TPL 来提高算法性能的尝试最终只会产生边际性能改进,而其他方法(如使用更合适的数据结构、缓存等)通常会产生改进数量级。
当然,如果您的应用程序一开始就不会太慢以满足您的需求,那么任何优化都将被视为过早优化,您希望避免这种情况。
但是,如果您出于某种原因发现自己在执行一个对并行性反应良好的 CPU 密集型操作,在您的代码的一部分绝对必须比当前执行得更快,那么并行处理是一个不错的选择。