如何设计高并发的服务器,如何提升服务器性能?

如何设计高并发的服务器,如何提升服务器性能?,第1张

您好楼主希望对您有帮助高并发对后台开发同学来说,既熟悉又陌生。熟悉是因为面试和工作经常会提及它。陌生的原由是服务器因高并发导致出现各位问题的情况少之又少。同时,想收获这方面的经验也是摸着石头过河,需要大量学习理论知识,再去探索。

如果是客户端开发的同学,字典中是没有“高并发”这个名词。这验证一句老话,隔行如隔山。客户端开发,特别是手机应用开发,更多地是考虑如何优化应用的性能,降低App的卡顿率

在这个“云”的时代,提高分布式系统并发能力的方式,方法论上主要有两种:垂直扩展(ScaleUp)与水平扩展(ScaleOut)。

1)垂直扩展

提升单机处理能力。垂直扩展的方式又有两种:

增强单机硬件性能,例如:增加CPU核数如32核,升级更好的网卡如万兆,升级更好的硬盘如SSD,扩充硬盘容量如2T,扩充系统内存如128G;

提升单机架构性能,例如:使用Cache来减少I/O次数,使用异步来增加单服务吞吐量,使用无锁数据结构来减少响应时间;

2)水平扩展

只要增加服务器数量,就能线性扩充系统性能。虚拟化技术的出现,让水平扩展变得轻松且简单。现在的云主机几乎是虚拟主机,而不是物理主机。这样的话,线性扩充也就是分分钟的事,前提是要有足够的物理主机支撑。

Web框架层

Web框架层就是我们开发出来的DjangoWeb应用程序。它负责处理>

WSGI层

WSGI不是用于与程序交互的API,也不是真实的代码,WSGI只是一种接口。它只适用于Python语言,其全称为WebServerGatewayInterface。其定义了web服务器和web应用之间的接口规范。

Web服务器层

Web服务层作用是主要是接收>

特别是Nginx,它的出现是为了解决C10K问题。Nginx依靠异步事件驱动架构来帮助其处理大量的并发会话,由于其对资源的轻量利用和伸缩自如的特性,它成为了广受欢迎的web服务器。

Django框架注重的数据交互。所以考虑的问题是Django适不适合于高并发的场景。

它是一个经过大型网站规模验证的框架。Instagram支撑上亿日活,所以Django能适用于高并发场景。所以不是想着Django框架能支撑到多大的并发量,而是我们想要抗住很大的并发量,怎么优化现有框架。总之这个问题不是这么简单的活到老学到老多看看技术类书籍结合自己的能力在进行改进

要实现每秒5000个并发请求接口,可以结合以下几种方案:
1 多进程或多线程:使用PHP的pcntl、pthreads等扩展库,创建多个进程或线程,每个进程或线程负责处理一部分请求。
2 异步IO:使用Swoole、ReactPHP等异步IO的框架,通过异步非阻塞IO的方式,能够让一个进程或线程处理多个请求,从而提高请求的处理能力。
3 负载均衡:使用Nginx、HAProxy等负载均衡软件,在多台服务器之间分发请求,每台服务器只需处理部分请求,从而提高整体处理能力。
具体实现需要综合考虑实际需求和系统性能等因素,对于不同情况可能需要采用不同方案。同时还需要注意避免出现资源竞争等问题,确保系统的稳定性和安全性。

提供几种供你思路:

1、网站页面静态化。静态化的页面为html(htm等)不需要web服务器重新加载项解析,只需要生成一次,以后每次都直接下载到客户端,效率高很多。

2、将网站的web服务器、数据库服务器、和文件服务器分开。通过将服务器专业化分工,以提高网站访问速度。因为和文件在下载的时候无论是IIS、Apache等服务器都会有很大压力。

3、设置专门的数据缓存服务器。将大量数据放到缓存数据区,在访问量少得时候存入数据,减少连接直接 *** 作数据库的开销。

4、数据库集群、库表散列。大型网站在面对大量访问的时候,会显现数据库的瓶颈,这时一台数据库将很快无法满足应用,于是我们需要使用数据库集群或者库表散列来分散压力。

5、镜像。镜像是大型网站常采用的提高性能和数据安全性的方式,镜像的技术可以解决不同网络接入商和地域带来的用户访问速度差异,比如ChinaNet和EduNet之间的差异就促使了很多网站在教育网内搭建镜像站点,数据进行定时更新或者实时更新。

6、负载均衡。负载均衡将是大型网站解决高负荷访问和大量并发请求采用的高端解决办法。

7、最新:CDN加速技术。什么是CDN?CDN的全称是内容分发网络。其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络“边缘”,使用户可以就近取得所需的内容,提高用户访问网站的响应速度。CDN有别于镜像,因为它比镜像更智能,或者可以做这样一个比喻:CDN=更智能的镜像+缓存+流量导流。

有什么方法衡量服务器并发处理能力
1 吞吐率
吞吐率,单位时间里服务器处理的最大请求数,单位req/s
从服务器角度,实际并发用户数的可以理解为服务器当前维护的代表不同用户的文件描述符总数,也就是并发连接数。服务器一般会限制同时服务的最多用户数,比如apache的MaxClents参数。
这里再深入一下,对于服务器来说,服务器希望支持高吞吐率,对于用户来说,用户只希望等待最少的时间,显然,双方不能满足,所以双方利益的平衡点,就是我们希望的最大并发用户数。
2 压力测试
有一个原理一定要先搞清楚,假如100个用户同时向服务器分别进行10个请求,与1个用户向服务器连续进行1000次请求,对服务器的压力是一样吗?实际上是不一样的,因对每一个用户,连续发送请求实际上是指发送一个请求并接收到响应数据后再发送下一个请求。这样对于1个用户向服务器连续进行1000次请求, 任何时刻服务器的网卡接收缓冲区中只有1个请求,而对于100个用户同时向服务器分别进行10个请求,服务器的网卡接收缓冲区最多有100个等待处理的请求,显然这时的服务器压力更大。
压力测试前提考虑的条件
并发用户数: 指在某一时刻同时向服务器发送请求的用户总数(>

本文先提供一个没有采用的方式--采用事务加select for update的形式

这么做呢就有个非常严重的问题,--- 同一时刻只有一个有效服务
如果A系统拿到了数据,开始了事务但是没提交,那么B系统同样的条件也会查到同一批还没处理好提交的数据,此时B系统该查询线程就会阻塞等待A提交事务这么看问题就来了,这里虽然保障了同一时刻只有一个服务可以拿到并处理一批数据,但是也导致了效率特别低,而且后面 无论扩展多少服务应用都没啥用

步骤解释:

我这里只写了大致的方案,一些redis高可用以及数据幂等性自己考虑去

这种方式是 我觉得最好的方案 了,完全保障了每个服务每次 处理 mysql的数据都是 互不相同的数据 ,完全 避免了竞争 问题

但是我们目前没有用这种方案,原因是目前我们redis内存只申请到一个比较小的内存,而 zset采用的跳跃表结构虽然保障了数据查询非常快速,但是也非常占用内存 ,预估了一下按照我们的数据量起码要存储300万数据,用到的内存量是 3~4G 之间,好家伙直接把我们所有内存都用了,其他服务还用个屁而且这玩意为了保障数据安全,不进行数据淘汰起码还要留个1G空闲安全空间那肯定就用不了了

如果你们的服务 数据量够小 或者 内存够大 ,redis又做到了 高可用,高可靠 ,那么我还是 十分推荐 用这种方案,毕竟很多服务都是 性能为王!

所谓同步,可以理解为在执行完一个函数或方法之后,一直等待系统返回值或消息,这时程序是出于阻塞的,只有接收到
返回的值或消息后才往下执行其它的命令。
异步,执行完函数或方法后,不必阻塞性地等待返回值或消息,只需要向系统委托一个异步过程,那么当系统接收到返回
值或消息时,系统会自动触发委托的异步过程,从而完成一个完整的流程。
同步在一定程度上可以看做是单线程,这个线程请求一个方法后就待这个方法给他回复,否则他不往下执行(死心眼)。
异步在一定程度上可以看做是多线程的(废话,一个线程怎么叫异步),请求一个方法后,就不管了,继续执行其他的方法。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/12621469.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-08-26
下一篇2025-08-26

发表评论

登录后才能评论

评论列表(0条)

    保存