partysip框架优化计划

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

Partysip优化计划

先说一下服务器构成,是使用开源的partysip项目,底层协议栈用的osip。修改了里面的注册服务器,在注册服务器上,连接mysql数据库。现在初步作了一些测试,但是感觉partysip处理过程并不满意,测试结果如下

客户端数量

客户并发数

持续时间(分钟)

服务器状态

备注

1

100

90

运行正常

CPU占用为40%,注册服务器内存消耗为24M

1

200

12

不能处理数据

注册服务器器无响应,mysql数据无问题

2

100

10

不能处理数据

注册服务器器无响应,mysql数据无问题

2

50

30

运行正常

 

测试服务器的配置如下
硬件:4G memory CPU 41.6GHZ,网卡:1000M双网卡

操作系统:windows2003+sp1

测试环境:注册服务器,mysql服务器同时运行。

总体上来说,注册服务器并发在200/秒时(还是客户端),只能同时保证5000人左右在线,这个数据太不理想了。这个过程肯定和数据库的访问有一定的关系,因为在注册服务器上,每有一个注册用户都需要首先遍历数据库中的表,之后根据遍历结果,决定是把用户记录写入数据库,还是修改数据库里面的记录,同时,在返回ACK时,需要再次遍历数据库,找到此用户的contect信息,并返回。访问mysql数据库的模块为单线程的。

研究过partysiposip朋友可能知道,partysip里面对于每个插件,都开启一个线程,另有一个管理线程。整个处理过程是串行处理的,所以执行效率并不是很高,我知道基于以上的测试结果提出优化方案是比较草率的,我也需要更深入的测试,我也将进行更深入的测试,但是这需要我们充分了解partysip框架,只是现在我只是忽略了解一下,但是发现不少问题,所以,提出此优化方案,当然随着理解的深入,测试结果的详细,可能在很多细节上修改我的认识,但是从大的方面来说,partysip设计并不适合做一个产品服务器(我的个人认识),因为在代码分析中,发现了很多问题(也不能说是问题,因为partysip并没有保证说这是一个完美的服务器,确切的讲不太适合对于大并发量的数据处理),比如没有采用内存池,线程池,基于系统级别的优化(比如完成端口,epoll),所以我想从大的方面开始逐步优化,也需要然后逐步验证我的设计方案是否真实有效。

1:增加buffercache

       主要使用方向是:对于频繁操作数据由文件系统,转移到内存统一管理,减少访问磁盘I/O的次数,从而所以数据访问时间。

       主要应用点是对数据库信息的缓存。从而减少二次访问数据库的时间消耗。

       原理:对于数据库中表数据进行缓存,对于注册信息首先从此buffer中检索,如果没有找到再进行数据库查询,并把查询结果保存到buffer表中。

       适用性:主要是为了优化,数据库访问功能模块,减少数据库的访问。从另一方面来说,我还考虑过把访问数据库的功能模块做成多线程的,并采用线程池进行管理,不过现在的首要目标可能是建立一个此buffer

2:内存池策略

       目的:对内存空间的统一分配和管理,减少直接对内存的分配和销毁的操作,较少内存碎片的产生,保障服务器长时间高效运行,要在多线程间运行,需要采用好的信号,互斥体等机制做保障,内存池策略并非内存垃圾回收策略,对于内存泄露,内存池策略无法解决。

       内存池策略的概要设计

       程序首次运行时,首先获取一定容量的内存,所以其他内存内存申请,都从这个内存中获得,当内存空间不足时,再次申请一定容量的内存。其内部实现时,可以把内存空间按大小不同的结构进行划分,并用一张空闲分配表(链)进行管理,分配算法可以参考操作系统内存分配算法(最佳分配算法),关于内存分配表的建立可以参考sccot meyermore effective C++》上面的内存池策略,令网上有大量内存池方面的论文可以参考。

       适用性:使用partysip时,发现其所有的内存申请和内存释放采用的函数均为osip_mallocosip_free,而不是直接调用C中的mallocfreeosip_mallocosip_free函数只是对mallocfree的简单封装。这样我们创建内存池策略时,只需修改osip_mallocosip_free函数即可,可以非常方面应用。

3线程池

       目的:增加服务器的响应时间,增大服务器的吞吐量,减少线程创建销毁和切换的时间损失。

       线程池的概要设计

       基于线程池的设计,目前比较流行的有两种1:生产者/消费者策略2Loader/Follower策略,基于服务器特性考虑(需要并发处理大量数据)以及参考一些成功例子,决定采用2策略:L/F策略的主要方式时,程序启动时创建一组线程,并通过一组策略来管理,其中一个线程为loader线程,此线程处于活动状态,当有信息到来时有loader线程处理,如果此时有来一个信息,线程池中一个被挂起的线程,被唤醒,来处理这个数据,处理完成后,如果还有活动线程就挂起,否则此线程讲作为loader线程,等待数据的到来,更详细的设计,参考同目录下的lf.pdf文档

       适用性:partysip采用为每个插件创建线程的方式,如果增加线程池,必须在数据到来的端口出,虽然有多个线程处理数据,但是由于每个插件只有一个线程,所以在具体处理数据时也必须等待插件线程处理完毕后,再次调用,所以如果快速实现,也需要把每插件有单一线程修改为每插件线程池策略,修改这两部分,几乎是partysip底层流程的修改。虽然增加线程池策略是服务器提速的最好方法,但是考虑其修改的复杂性,需要仔细partysip框架以及sip协议,分析后修改。

4基于系统的优化

说明:系统的优化,主要针对操作系统所提供的高级I/O访问功能的优化,比如windows

下的完成端口,linux下的epoll,比使用简单的socket机制,要快很多。普通的绑定端口,监听机制,并发总数只有几百个,而采用完成端口或epoll后,处理并发的数量在几万个左右,参考msdn上的完成端口性能测试。

       简单实现:

由于基于系统的优化是与操作系统息息相关的,不同操作系统下,具体实现方式不同,所以,为了有更好的适用性,需要提供windows下和linux下两种机制。

适用性:根据目前掌握的资料来看,由socket机制转换为linux下的epollwindows下完成端口,并不是很难,本质上讲完成端口或者epoll都是在socket绑定端口的基础增加了线程池(lp策略),可以方便异步调用。因为修改涉及到partysip底层逻辑的修改,所以需要仔细分析partysip框架以及sip协议。

我知道从整体上来说,提高系统得并发数是一项非常系统的优化工作,涉及到硬件选择,操作系统的支持,辅助工具的优化,软件的设计等多方面工作。因此在具体过程中,并不是简单的通过更新硬件,更换操作系统,优化辅助工具,更改部分软件设计就可以解决。需要系统级别的架构和设计,在具体操作过程中,只修改一部分,并不会马上看到优化结果,需要一个长期的测试过程。所以,基于这些考虑,服务器端的设计必须建立一个良好的设计框架之上,以及具有足够的优化余地。

       在这里希望各位做过基于partysip服务器的朋友,多多提建议,并且谈谈你们服务器在具体设计过程中碰到的问题,以及是如何解决。同时希望做过服务器的朋友,多多给我提到的优化方案提建议,谈谈你们做服务器时的一些心得,并且在不影响商业版权的情况,仅可能的多告知一些技术,非常感谢大家。同时也希望本文能够对正在做partysip或者在项目中打算使用partysip的朋友提供借鉴的作用。

参考资料:

在即时通信软件中,如何提高服务器支持的最大连接数
http://www.linuxforum.net/forum/gshowthreaded.php?Cat=&Board=program&Number=529852&page=1&view=expanded&sb=5&o=all

Writing Windows NT Server Applications in MFC Using I/O Completion Ports

http://msdn2.microsoft.com/en-us/library/ms810436.aspx

Win32 Multithreading Performance

http://msdn2.microsoft.com/en-us/library/ms810437.aspx

网络的基础架构:  ACE 

www.chinaunix.net上的大量文章

UNIX网络编程》I

Linux下通用线程池的构建(http://blog.csdn.net/tingya/archive/2004/12/23/226614.aspx

微软msn服务器设计思想初步理解

http://blog.csdn.net/fangzhengzhu/archive/2005/01/21/262886.aspx

高性能服务器软件开发
The C10K problem

http://www.kegel.com/c10k.html

MMORPG游戏服务器端的设计

http://blog.csdn.net/yahle/archive/2005/01/12/250034.aspx

线程池的介绍及简单实现

http://blog.csdn.net/IOKE/archive/2004/10/25/150874.aspx

部分参考资料,参考同目录下的pdf文件

用完成端口开发大响应规模的Winsock应用程序(1)(2)(3)(4)(5

http://dev.csdn.net/develop/article/15/15211.shtm
Write Scalable Winsock Apps Using Completion Ports

http://msdn.microsoft.com/msdnmag/issues/1000/Winsock/Winsock.asp

Improving Runtime Performance with the Smooth Working Set Tool

http://msdn.microsoft.com/msdnmag/issues/1000/Bugslayer/

UDP并发服务器设计讨论一:一台主机、一个CPU,实现单位时间内最大并发数

http://www.linuxforum.net/forum/showflat.php?Cat=&Board=program&Number=599334&page=4&view=expanded&sb=9&o=all&fpart=all&vc=1

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
监控 安全 API
使用PaliGemma2构建多模态目标检测系统:从架构设计到性能优化的技术实践指南
本文详细介绍了PaliGemma2模型的微调流程及其在目标检测任务中的应用。PaliGemma2通过整合SigLIP-So400m视觉编码器与Gemma 2系列语言模型,实现了多模态数据的高效处理。文章涵盖了开发环境构建、数据集预处理、模型初始化与配置、数据加载系统实现、模型微调、推理与评估系统以及性能分析与优化策略等内容。特别强调了计算资源优化、训练过程监控和自动化优化流程的重要性,为机器学习工程师和研究人员提供了系统化的技术方案。
186 77
使用PaliGemma2构建多模态目标检测系统:从架构设计到性能优化的技术实践指南
|
3月前
|
算法 JavaScript Java
weiV 框架的性能
【10月更文挑战第30天】weiV 框架目前还在快速迭代中,其性能可能会随着后续的优化和改进不断提升。但总体而言,从目前已有的信息和特性来看,weiV 框架在性能方面具有很大的潜力,有望为 Android 开发者提供一种高效、灵活的声明式 UI 开发解决方案。
44 1
|
5月前
|
缓存 前端开发 JavaScript
构建高性能单页应用(SPA)的实践与优化
构建高性能单页应用(SPA)的实践与优化
94 6
|
5月前
|
Linux Windows
framelesshelper框架学习
文章介绍了一个名为framelesshelper的框架,它可以创建跨平台的无边框窗口,并解决了窗口大小异常的问题。文中还提供了cmakelist.txt的适配方法和相关代码学习资源。
framelesshelper框架学习
|
8月前
|
分布式计算 大数据 数据处理
深度解密Spark性能优化之道
课程通过实战案例解析和性能调优技巧的讲解,帮助学员提升大数据处理系统的性能和效率。课程内容涵盖了Spark性能调优的各个方面,包括内存管理、并行度设置、数据倾斜处理、Shuffle调优、资源配置等关键技术和策略。学员将通过实际案例的演示和分析,掌握解决Spark应用性能问题的方法和技巧,从而提升数据处理效率,优化应用性能。无论您是初学者还是有一定经验的大数据工程师,本课程都将为您提供宝贵的实战经验和实用技能,助您成为Spark性能调优的专家。
78 7
深度解密Spark性能优化之道
|
6月前
|
SQL API 数据库
揭开高效数据层构建的秘密武器:Entity Framework Core 分页查询的最佳实践与性能优化技巧全解析
【8月更文挑战第31天】本文以随笔形式详细探讨了如何在Entity Framework Core中实现分页查询的最佳实践。通过创建基于EF Core的项目,配置数据库上下文,并定义领域模型,文章展示了如何使用`Skip()`和`Take()`方法进行分页查询。此外,还介绍了如何使用惰性加载、显式加载和预加载来优化性能,并通过投影技术减少不必要的数据加载。最后,文章强调了分页查询对于提升应用性能和用户体验的重要性。
131 0
|
8月前
|
存储 缓存 前端开发
单页应用(SPA)的架构与优化:深度探索与实践
【6月更文挑战第11天】本文探讨了单页应用(SPA)的架构与优化,包括前后端分离、路由管理和状态管理基础,以及加载性能、路由和状态管理的优化策略。通过合理设计与优化,SPA能提供流畅体验,同时应对加载性能、路由导航和状态管理的挑战。文章旨在帮助读者理解并提升SPA应用的性能和用户体验。
|
8月前
|
jenkins 测试技术 持续交付
利用C++增强框架的可测试性(Testability)
**C++框架可测试性提升策略**:通过模块化设计、依赖注入、使用Mock对象和Stub、编写清晰接口及文档、断言与异常处理、分离测试代码与生产代码、自动化测试,可以有效增强C++框架的可测试性。这些方法有助于确保代码正确性、健壮性,提高可维护性和可扩展性。示例包括使用类和接口实现模块化,通过构造函数进行依赖注入,以及利用Google Test和Google Mock进行断言和模拟测试。
124 1
|
9月前
|
SQL JSON 关系型数据库
selenuim实战优化
该文介绍了如何使用Selenium将数据直接存入MySQL数据库,以苏宁易购网站为例。首先,优化了JSON数据写入,通过pymysql连接数据库,创建`books`表并读取JSON文件插入数据。接着,整合代码实现直接从网页抓取价格和标题,使用Selenium自动化滚动加载页面,定位元素,清洗数据并使用参数化查询插入到`books`表。主程序循环遍历多页数据,最后关闭数据库连接。
62 1
|
SQL Java 关系型数据库
Querydsl-JPA 框架
Querydsl-JPA 框架
2365 1

热门文章

最新文章