当前位置:首页 > 科技  > 软件

单服务器高性能模式:PPC与TPC

来源: 责编: 时间:2024-04-12 09:05:20 307观看
导读高性能是每位程序员的追求。无论我们设计系统还是编写代码,都渴望达到最佳性能。但实现高性能是极为复杂的,因为诸如磁盘、操作系统、CPU、内存、缓存、网络、编程语言和架构等因素都可能影响系统性能。一个不当的 debu

高性能是每位程序员的追求。无论我们设计系统还是编写代码,都渴望达到最佳性能。但实现高性能是极为复杂的,因为诸如磁盘、操作系统、CPU、内存、缓存、网络、编程语言和架构等因素都可能影响系统性能。一个不当的 debug 日志,甚至可能将服务器的性能从每秒处理 30000 个事务降低到 8000 个;一个 tcp_nodelay 参数的设置,可能将响应时间从 2 毫秒延长到 40 毫秒。因此,实现高性能是一项极具挑战性的任务。软件系统开发的不同阶段都会对最终的性能产生影响。1wY28资讯网——每日最新资讯28at.com

站在架构师的角度,特别关注高性能架构的设计是至关重要的。高性能架构设计主要集中在两个方面:1wY28资讯网——每日最新资讯28at.com

  1. 尽量提升单个服务器的性能,将其性能发挥到极致。
  2. 如果单服务器无法满足性能需求,则设计服务器集群方案。

除了上述两点,系统最终能否实现高性能还与具体的实现和编码有关。但架构设计是实现高性能的基础。如果架构设计不能达到高性能要求,那么后续的实现和编码优化也只能在有限的空间内发挥作用。可以形象地说,架构设计决定了系统性能的上限,而实现细节则决定了系统性能的下限。1wY28资讯网——每日最新资讯28at.com

实现单服务器高性能的关键之一是选择合适的并发模型。并发模型涉及以下两个关键设计点:1wY28资讯网——每日最新资讯28at.com

  1. 服务器如何管理连接。
  2. 服务器如何处理请求。

这两个设计点最终都与操作系统的 I/O 模型和进程模型相关。常见的 I/O 模型包括阻塞、非阻塞、同步和异步;而进程模型可以是单进程、多进程或多线程。1wY28资讯网——每日最新资讯28at.com

PPC

PPC,即 Process Per Connection,意味着每次有新连接时就会创建一个新的进程来专门处理该连接的请求。这是传统 UNIX 网络服务器常采用的模型。1wY28资讯网——每日最新资讯28at.com

图片图片1wY28资讯网——每日最新资讯28at.com

在这种模式下,父进程负责接受连接,并在接受到连接后通过“fork”创建一个子进程来处理连接的读写请求。子进程处理完请求后关闭连接。需要注意的是,在“fork”创建子进程后,父进程直接调用 close,看起来好像是关闭了连接,但实际上只是减少了连接的文件描述符引用计数。真正的关闭连接是在子进程调用 close 后,连接的文件描述符引用计数变为 0,操作系统才会真正关闭连接。1wY28资讯网——每日最新资讯28at.com

PPC 模式实现简单,适用于连接数不多的情况,比如数据库服务器。在互联网兴起之前,对于普通的业务服务器,由于访问量和并发量相对较低,这种模式运作良好。世界上第一个 web 服务器 CERN httpd 就采用了这种模式。1wY28资讯网——每日最新资讯28at.com

然而,随着互联网的发展,服务器的并发和访问量激增,PPC 模式的弊端也显现出来:1wY28资讯网——每日最新资讯28at.com

fork 代价高:创建一个进程的代价很高,需要分配大量内核资源,将内存映像从父进程复制到子进程。即使现在的操作系统采用了 Copy on Write 技术,总体上创建进程的代价仍然较高。1wY28资讯网——每日最新资讯28at.com

父子进程通信复杂:父进程“fork”子进程后,父子进程之间通信复杂,需要采用 IPC 进程通信方案。例如,子进程需要在关闭连接之前告知父进程处理了多少个请求,以支持父进程进行全局统计。1wY28资讯网——每日最新资讯28at.com

并发连接数量有限:如果每个连接存活时间较长且新连接不断进来,进程数量会不断增加,导致操作系统进程调度和切换频繁,系统压力增大。因此,一般情况下,PPC 方案最多能处理的并发连接数量只有几百个。1wY28资讯网——每日最新资讯28at.com

TPC

TPC,即 Thread Per Connection,意味着每次有新连接时都会创建一个新线程专门处理该连接的请求。相比进程,线程更轻量级,创建线程的开销更小;同时,线程共享进程内存空间,线程间通信相对简单。因此,TPC 实际上是解决了或者减轻了 PPC 中 fork 代价高和父子进程通信复杂的问题。1wY28资讯网——每日最新资讯28at.com

图片图片1wY28资讯网——每日最新资讯28at.com

在TPC模式下,父进程负责接受连接,然后创建子线程来处理连接的读写请求,最后子线程关闭连接。与 PPC 不同的是,主进程无需手动关闭连接,因为子线程共享主进程的进程空间,连接的文件描述符没有被复制,只需一次 close 即可。1wY28资讯网——每日最新资讯28at.com

尽管TPC解决了 fork 代价高和进程通信复杂的问题,但也带来了新的挑战:1wY28资讯网——每日最新资讯28at.com

创建线程虽然比创建进程代价低,但在高并发情况下(如每秒上万连接),仍存在性能问题。1wY28资讯网——每日最新资讯28at.com

虽然无需进程间通信,但线程间的互斥和共享带来了复杂性,容易导致死锁问题。1wY28资讯网——每日最新资讯28at.com

多线程会出现互相影响的情况,某个线程异常可能导致整个进程退出(如内存越界)。1wY28资讯网——每日最新资讯28at.com

除了引入新的问题,TPC 仍然面临 CPU 线程调度和切换的代价。因此,在并发连接几百个的场景下,更倾向于使用 PPC,因为它没有死锁风险,也不会受多进程相互影响,具有更高的稳定性。1wY28资讯网——每日最新资讯28at.com

prethread

TPC模式中,只有在连接进来时才创建新的线程来处理连接请求。尽管创建线程比创建进程更轻量级,但仍然存在一定的代价。为了解决这个问题,出现了prethread模式。1wY28资讯网——每日最新资讯28at.com

图片图片1wY28资讯网——每日最新资讯28at.com

类似于prefork,prethread模式会预先创建线程,然后开始接受用户请求。这样,当新连接进来时,就无需再创建线程,从而提升用户感知的速度和体验。1wY28资讯网——每日最新资讯28at.com

由于多线程之间数据共享和通信更方便,prethread的实现方式比prefork更灵活。常见的实现方式包括:1wY28资讯网——每日最新资讯28at.com

主进程accept连接,然后将连接交给某个线程处理。1wY28资讯网——每日最新资讯28at.com

多个子线程尝试accept连接,只有一个线程accept成功。1wY28资讯网——每日最新资讯28at.com

Apache服务器的MPM worker模式本质上就是一种prethread方案,但进行了改进。Apache首先创建多个进程,每个进程再创建多个线程。这样做的主要考虑是为了提高稳定性,即使某个子进程的某个线程异常退出,仍会有其他子进程继续提供服务,不会导致整个服务器崩溃。1wY28资讯网——每日最新资讯28at.com

prethread理论上可以支持比prefork更多的并发连接。例如,Apache服务器的MPM worker模式默认支持400个并发处理线程(16个进程 × 25个线程)。1wY28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-83109-0.html单服务器高性能模式:PPC与TPC

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Python性能监控利器:执行时间计算的终极指南

下一篇: 127.0.0.1 和 localhost 之间到底有什么区别,这篇文章全都告诉你

标签:
  • 热门焦点
  • 6月iOS设备性能榜:M2稳居榜首 A系列只能等一手3nm来救

    没有新品发布,自然iOS设备性能榜的上榜设备就没有什么更替,仅仅只有跑分变化而产生的排名变动,毕竟苹果新品的发布节奏就是这样的,一年下来也就几个移动端新品,不会像安卓厂商,一
  • 服务存储设计模式:Cache-Aside模式

    Cache-Aside模式一种常用的缓存方式,通常是把数据从主存储加载到KV缓存中,加速后续的访问。在存在重复度的场景,Cache-Aside可以提升服务性能,降低底层存储的压力,缺点是缓存和底
  • 一篇聊聊Go错误封装机制

    %w 是用于错误包装(Error Wrapping)的格式化动词。它是用于 fmt.Errorf 和 fmt.Sprintf 函数中的一个特殊格式化动词,用于将一个错误(或其他可打印的值)包装在一个新的错误中。使
  • Java NIO内存映射文件:提高文件读写效率的优秀实践!

    Java的NIO库提供了内存映射文件的支持,它可以将文件映射到内存中,从而可以更快地读取和写入文件数据。本文将对Java内存映射文件进行详细的介绍和演示。内存映射文件概述内存
  • 学习JavaScript的10个理由...

    作者 | Simplilearn编译 | 王瑞平当你决心学习一门语言的时候,很难选择到底应该学习哪一门,常用的语言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • 本地生活这块肥肉,拼多多也想吃一口

    出品/壹览商业 作者/李彦编辑/木鱼拼多多也看上本地生活这块蛋糕了。近期,拼多多在App首页“充值中心”入口上线了本机生活界面。壹览商业发现,该界面目前主要
  • 新电商三兄弟,“抖快红”成团!

    来源:价值研究所作 者:Hernanderz 随着内容电商的概念兴起,抖音、快手、小红书组成的“新电商三兄弟”成为业内一股不可忽视的势力,给阿里、京东、拼多多带去了巨大压
  • 华为Mate 60系列用上可变灵动岛:正式版体验将会更出色

    这段时间以来,关于华为新旗舰的爆料日渐密集。据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将
  • Meta盲目扩张致超万人被裁,重金押注元宇宙而前景未明

    图片来源:图虫创意日前,Meta创始人兼CEO 马克·扎克伯发布公开信,宣布Meta计划裁员超11000人,占其员工总数13%。他公开承认了自己的预判失误:“不仅
Top