高性能网络编程 - The C10M problem

文章目录

  • Pre
  • 概述
  • 回顾C10K
  • 实现C10M的挑战
  • 思路总结

在这里插入图片描述


Pre

高性能网络编程 - The C10K problem 以及 网络编程技术角度的解决思路


概述

在接下来的10年里,因为IPv6协议下每个服务器的潜在连接数都是数以百万级的,单机服务器处理数百万的并发连接(甚至千万)并非不可能,但我们需要重新审视目前主流OS针对网络编程这一块的具体技术实现

实现C10M(单机千万级并发连接处理能力)确实是一个挑战,但在过去的几年中,有人采用一些创新的方法来应对这一挑战。其中,Errata Security的CEO Robert Graham在Shmoocon 2013大会上的演讲可能提供了一些有趣的见解。 C10M Defending The Internet At Scale

在这个演讲中,Robert Graham可能讨论了一些采用非传统方法来实现高并发连接处理的思路。这些方法可能包括:

  1. 用户态网络栈:将网络栈移至用户态,以便更灵活地处理连接和网络数据。这种方法可以减少内核级别的开销,并提高性能。

  2. 事件驱动架构:采用事件驱动编程模型,以便在有事件发生时立即响应,而不是传统的轮询方式。这可以减少不必要的CPU消耗。

  3. 集群和分布式架构:将服务器架构设计成集群或分布式系统,以分担负载,同时提高容错性。

  4. 内存映射文件:使用内存映射文件来加速数据读写操作,从而提高I/O性能。

  5. 高性能编程语言:采用高性能编程语言,如Rust或Go,以减少内存和性能开销。

Robert Graham的结论是:OS的内核不是解决C10M问题的办法,恰恰相反OS的内核正是导致C10M问题的关键所在.

Robert Graham的观点强调了操作系统内核不是解决C10M问题的最佳方式,反而它可能是导致C10M问题的关键。他提出一种创新的思考方式,主张将部分繁重的任务从操作系统内核转移到应用程序,以实现更高级别的并发连接处理能力。

他的观点总结如下:

  1. 不要让操作系统内核执行所有繁重的任务:应用程序可以高效地处理数据包、内存管理、处理器调度等任务,而将操作系统内核的角色限制为控制层。这样,操作系统主要负责控制而不负担数据处理的任务。

  2. 设计系统以面向数据层为导向:系统应能够在200个时钟周期内处理数据包,并在14万个时钟周期内处理应用程序逻辑。通过最大限度地减少代码和缓存失效,可以实现高效的性能。

  3. 专业化可扩展性:C10M问题需要专业化的解决方法,不能简单地依赖操作系统来解决性能问题。开发人员需要自己主动处理性能问题,而不是将其外包给操作系统。

总之,Robert Graham的观点强调了在面对C10M问题时,需要采取一种更加自主和专业化的方法,将操作系统内核的角色限制为控制,将数据处理任务留给应用程序,以实现更高级别的并发连接处理能力。这种方法可能需要深入研究和专业知识,但它代表了一种创新的思考方式,旨在解决高性能网络编程的挑战。

这些方法可能需要深入研究和技术专长,但它们代表了一种不同于传统方式的思考方式,旨在实现更高级别的并发连接处理能力。随着技术的不断发展和创新,我们可能会看到更多的解决方案出现,使C10M成为可能。

在这里插入图片描述


回顾C10K

在解决C10K问题时,传统的网络编程模型,如Apache,存在一些明显的限制,这些限制影响了服务器的性能和可扩展性。以下是Apache及其问题的一些方面以及相关的解决方法:

  1. 性能与可扩展性的区别:性能和可扩展性并不是相同的概念。性能是指服务器在处理连接时的吞吐量和响应时间,而可扩展性是指服务器能够同时处理多少并发连接。对于传统的Apache服务器,性能和可扩展性之间存在明显的差距。

  2. 短期连接和性能:Apache在处理持续几秒的短期连接(如快速事务)时,性能下降明显。当每秒处理1000个事务时,只能维持约1000个并发连接。如果事务延长到10秒,要维持每秒1000个事务,必须打开1万个并发连接。在这种情况下,即使没有DoS攻击,Apache的性能也会急剧下降,大量下载操作可能导致Apache崩溃。

  3. 提高处理规模的问题:即使通过硬件升级和处理器速度提高性能,Apache仍然无法处理更多的并发连接。这是因为Apache创建一个CGI进程然后关闭,这个过程并没有扩展。内核使用的O(N^2)算法使服务器难以处理数以万计的并发连接。

解决这些问题的方法可能包括:

  • 采用事件驱动服务器模型,如Nginx和Node.js,代替传统的线程服务器。这些服务器能够更高效地处理大量并发连接,因为它们采用异步非阻塞I/O模型,而不是为每个连接创建线程或进程。

  • 优化服务器内核以提高性能和可扩展性,例如通过使用更高级的数据结构和算法来改善内核的连接管理。

  • 考虑使用缓存、负载均衡和分布式系统来处理大规模并发连接,以提高服务器的性能和可扩展性。

总之,传统的网络编程模型,如Apache,在面对大规模并发连接时存在明显的性能和可扩展性限制,而采用事件驱动服务器模型和优化内核等方法可以改善这些问题。这些方法可以帮助服务器更好地应对C10K问题,并提高性能和规模。

解决并发性能问题的根本方法在于改进操作系统内核,以便在常数时间内查找连接,减少线程切换时间与线程数量的相关性。这主要涉及两个基本问题:

  1. 连接数与线程数/进程数之间的关系:在传统的操作系统内核中,当数据包到达时,内核需要遍历所有进程以确定由哪个进程来处理这个数据包。这导致了连接数与线程数/进程数之间的关系,增加连接数会增加处理数据包的开销。

  2. 连接数与选择数/轮询次数(单线程)之间的关系:在单线程轮询模型中,每个数据包需要遍历列表上的所有socket,这会导致连接数与轮询次数之间的关系。

解决这些问题的方法包括:

  • 改进操作系统内核,以便在常数时间内查找连接,减少连接查找的开销。
  • 使用可扩展的系统调用,如epoll()/IOCompletionPort,以在常数时间内执行socket查询,而不是使用传统的轮询方式。
  • 采用异步编程模式,以便服务器能够更高效地处理大规模并发连接。这包括采用事件驱动编程模型,如Nginx和Node.js,以处理连接的事件而不是为每个连接创建线程或进程。

迁移到Nginx和Node类型的服务器时,即使在较低配置的服务器上增加连接数,性能也不会急剧下降,因为这些服务器采用了异步编程模式,并且改进了操作系统内核以提高连接查找的效率。因此,在处理C10K连接时,性能不再受线程数量的限制,而是取决于操作系统内核和服务器的实际处理能力。这也是过去解决C10K问题的常见方法。

在这里插入图片描述


实现C10M的挑战

实现1千万的并发连接挑战意味着需要应对以下方面的要求和挑战:

  1. 1千万的并发连接数:服务器需要能够同时处理1千万个活跃连接,这意味着需要非常高的连接管理和处理能力。

  2. 100万个连接/秒:服务器需要每秒处理100万个连接请求,而每个连接通常会持续约10秒,这要求服务器具备出色的连接建立和管理速度。

  3. 10GB/秒的连接:服务器需要具备10GB/秒的连接带宽,以支持快速连接到互联网,这需要高性能的网络设备和带宽管理。

  4. 1千万个数据包/秒:估计服务器需要每秒处理1千万个数据包,这要求服务器具备强大的数据包处理和传输能力,以及高效的网络栈。

  5. 10微秒的延迟:服务器需要具备非常低的延迟,以快速响应连接请求和数据包传输,但随着连接数量的增加,延迟可能会增加,需要有效的延迟管理。

  6. 10微秒的抖动:服务器需要保持延迟的稳定性,以限制最大延迟,避免不稳定的延迟对性能产生负面影响。

  7. 并发10核技术:服务器软件需要支持更多核的服务器,通常情况下,软件能够轻松扩展到四核,但为了支持更多核的服务器,可能需要重新设计和重写软件,以充分利用多核处理器。

这些要求和挑战需要在硬件、操作系统、网络设备和服务器软件层面进行深入的优化和改进,以实现10M的并发连接。这是一个复杂而高度技术性的挑战,通常需要专业知识和资源,以满足如此高的性能和可扩展性要求。


实现C10M(1千万)的并发连接挑战确实主要在软件层面,而不是硬件层面。以下是一些主要原因和解决思路:

  1. 初始设计目标:Unix操作系统最初的设计目标是作为电话网络的控制系统,而不是作为服务器操作系统。因此,Unix内核和操作系统的设计主要关注用户和任务的控制,而没有专门考虑高性能数据处理。这导致了在处理大规模并发连接时性能瓶颈。

  2. 多核处理器:现代处理器通常具有多个核心,而传统的操作系统代码使用多线程或多任务来提高性能。然而,如何有效利用多核处理器来提高性能和可扩展性是一个关键问题。

  3. 内存访问速度和缓存:内存访问速度相对较慢,而CPU内部缓存的容量有限。在处理大规模并发连接时,需要在有限的时间内完成数据包处理,因此需要考虑内存访问速度和缓存的优化。

解决思路包括:

  • 数据包直接传递到业务逻辑:避免数据包经过复杂的Linux内核协议栈,将数据包直接传递给应用层的业务逻辑进行处理,减少性能下降和内存占用。

  • 多线程的核间绑定:将不同线程绑定到不同的处理核心,最大化核心CACHE利用,实现无锁设计,避免进程切换消耗。

  • 内存优化:预留业务所需内存,脱离Linux内核的管理,并采用更大的内存分页,减少地址转换等性能消耗。

这些措施有助于提高操作系统和服务器软件的性能,以满足C10M级别的并发连接要求。这表明在处理大规模并发连接时,软件的设计和优化是至关重要的,硬件性能也需要充分发挥,但不是性能瓶颈所在。


思路总结

解决C10M问题需要综合考虑多个方面,以下是一些关键思路的总结:

  1. 网卡问题:网卡的内核工作效率可能不高,需要通过自己的驱动程序和管理来提高网卡性能,远离操作系统的干预。

  2. CPU问题:传统的内核方法无法有效协调大规模的并发连接,需要采用不同的方法。一种解决方案是Linux管理前两个CPU核心,而应用程序管理其余的CPU核心,以避免资源争用和提高性能。

  3. 内存问题:内存管理需要特别关注,以实现高效的数据处理。在系统启动时,分配大部分内存给应用程序管理的大内存页,以减少内存访问的性能消耗。

  4. 控制层与数据层分离:一种解决思路是将控制层交给操作系统(如Linux),而应用程序负责数据层的管理。这意味着应用程序与内核之间几乎没有交互,没有线程调度、系统调用或中断。这样的分离可以提高性能和可扩展性。

总的来说,解决C10M问题需要综合考虑硬件和软件方面的优化措施,以实现高性能和高并发的连接处理。这也要求在熟悉的编程和开发环境中进行定制硬件和软件的开发,以满足C10M级别的性能要求。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/135548.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于单片机智能加湿器控制系统仿真设计

**单片机设计介绍, 698【毕业课设】基于单片机智能加湿器控制系统仿真设计 文章目录 一 概要系统组成总结 二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 单片机智能加湿器控制系统仿真设计介绍 单片机智能加湿器控制系统是一种利用微…

Jakarta-JVM篇

文章目录 一.前言1. 1 JVM-堆常用调参1.2 JVM-方法区常用参数1.3 JVM-codeCache 二.JVM内存结构三. 对象创建四. JVM垃圾回收算法4.1 可达性分析算法4.1.1 对象引用4.1.2 回收方法区. 4.2 分代回收4.3 标记清除4.4 标记复制4.5 标记整理 五.垃圾回收器5.1 根节点枚举5.2 安全点…

umi4 React项目使用icon集合

umi项目中使用icon集合。 icon集合:https://icones.js.org/ 测试使用这个ion .umirc.ts文件 icons:{autoInstall:{iconify-json/ion: true,//自动安装iconify-json/ion},include: [ion:social-windows-outline],//要使用的必须把icon类名加到include中…

AndroidStudio 运行报错:Invalid keystore format

AndroidStudio 运行报错:Invalid keystore format 把这玩意儿删了重新打开Android Studio运行一下就好了!!!

esxi 6.7下安装黑裙

esxi上创建一个黑裙系统的虚拟机,用来存资料 一、工具 硬件: 工控机:装有esxi6.7系统(192.168.100.2),配置:3865U,16G内存,120Gmsata120sata硬盘,6个网口 主…

利用Ansible实现批量Linux服务器安全配置

1.摘要 在上一篇<<初步利用Ansible实现批量服务器自动化管理>>文章中, 我初步实现了通过编写清单和剧本来实现多台服务器的自动化管理,在本章节中, 我将利用Ansible的剧本来实现更实用、更复杂一点的功能, 主要功能包括三个:1.同时在三台服务器中增加IP访问控制,只…

杂货铺 | citespace的使用

安装教程 【CiteSpace保姆级教程1】文献综述怎么写&#xff1f; &#x1f4da;数据下载 1. 新建文件夹 2. 数据下载 知网高级检索 数据选中导出 &#xff1a;一次500 导出后重命名为download_xxx.txt&#xff0c;放到input文件里 3. 数据转换 把output里的数据复制到data里…

Qt实现自定义多选下拉列表

目录 前言1、 功能描述2、代码实现总结 前言 本文记录了一种通过继承 QComboBox 实现下拉列表多选功能的方法。效果如下图所示&#xff1a; 1、 功能描述 普通的下拉列表只支持选择一个选项&#xff0c;在软件开发过程中&#xff0c;经常会遇到下拉列表支持选择多个选项的需…

Mybatis-Plus同时使用逻辑删除和唯一索引的问题及解决办法

1 问题背景 在开发中&#xff0c;我们经常会有逻辑删除和唯一索引同时使用的情况。但当使用mybatis plus时&#xff0c;如果同时使用逻辑删除和唯一索引&#xff0c;会报数据重复Duplicate entry的问题。 举例来说&#xff0c;有表user&#xff0c;建立唯一索引&#xff08;u…

centos 7部署Mysql8.0主从

Mysql官网中关于部署主从的网址 环境准备&#xff1a; 搭建虚拟机和安装Mysql之前的文章中已经涉及&#xff0c;在此不再赘述。 主从IPMysql账号密码主192.168.213.4root/Root1234!从192.168.213.5root/Root1234! 1、主数据库设置 配置my.cnf 一般存放于/etc/。 主从配…

idea使用git删除本地提交(未推送)

1、找到reset head 2、打开弹窗&#xff0c;在HEAD后面输入^ 结果为HEAD^ 注释&#xff1a; Reset Type 有三种&#xff1a; Mixed&#xff08;默认方式&#xff09;&#xff0c;保留本地源码&#xff0c;回退 commit 和 index 信息&#xff0c;最常用的方式Soft 回退到某个版本…

用于图像处理的高斯滤波器 (LoG) 拉普拉斯

一、说明 欢迎来到拉普拉斯和高斯滤波器的拉普拉斯的故事。LoG是先进行高斯处理&#xff0c;继而进行拉普拉斯算子的图像处理算法。用拉普拉斯具有过零功能&#xff0c;实现边缘岭脊提取。 二、LoG算法简述 在这篇博客中&#xff0c;让我们看看拉普拉斯滤波器和高斯滤波器的拉普…

STM32_project:led_beep

代码&#xff1a; 主要部分&#xff1a; #include "stm32f10x.h" // Device header #include "delay.h"// 给蜂鸣器IO口输出低电平&#xff0c;响&#xff0c;高&#xff0c;不向。 //int main (void) //{ // // 开启时钟 // RC…

Git 行结束符:LF will be replaced by CRLF the next time Git touches it问题解决指南

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

怎么学编程效率高,编程练习网站编程软件下载,中文编程开发语言工具下载

怎么学编程效率高&#xff0c;编程练习网站编程软件下载&#xff0c;中文编程开发语言工具下载 给大家分享一款中文编程工具&#xff0c;零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&#xff0c;而且可以开发大型的…

MySQL的默认引擎为什么是InnoDB

MySQL支持InnoDB、MyISAM、MEMORY、CSV等多个存储引擎&#xff0c;那为什么选InnoDB作为默认引擎呢&#xff1f; 主要原因有几点&#xff1a; 事务 事务主要用于保持数据一致性&#xff0c;是一组操作的集合&#xff0c;要么全部成功&#xff0c;要么全部失败。InnoDB引擎提供…

Pytorch 里面torch.no_grad 和model.eval(), model.train() 的作用

torch.no_grad: 影响模型的自微分器&#xff0c;使得其停止工作&#xff1b;这样的话&#xff0c;数据计算的数据就会变快&#xff0c;内存占用也会变小&#xff0c;因为没有了反向梯度计算&#xff0c;当然&#xff0c;我哦们也无法做反向传播。 model.eval() 和model.train()…

【动手学深度学习】课程笔记 05-07 线性代数、矩阵计算和自动求导

05 线性代数 1. 基础知识补充 向量相关 矩阵相关 简单来说&#xff0c;范数是用来衡量矩阵&#xff08;张量&#xff09;大小的值&#xff0c;范数的值有不同的规定。 2. 代码实现 仅记录一些我比较陌生的知识。 张量的克隆 A torch.arange(20, dtypetorch.float32).resh…

【C++】继承详解

本篇要分享的内容是关于继承的内容哼哼哼啊啊啊啊啊啊啊啊啊啊啊啊啊啊 以下为本篇目录 目录 1.简单了解继承 2.继承的简单定义 3.继承简单使用 4.继承方式 4.1基类的privat 4.2基类的protected 4.3不可见与private的区别 5.父子类对象赋值转换 6.继承的作用域 7.子…

Linux C语言进阶-D14指针函数

指针函数&#xff1a;指一个函数的返回值为地址量的函数 <数据类型>* <函数名称>&#xff08;<参数说明>&#xff09; { 语句序列; } 返回值&#xff1a;全部变量的地址、静态变量的地址、字符串常量的地址、堆上的地址 注意&#xff1a;不可返回局部变量…