常见多线程与并发服务器设计方案举例

常见多线程与并发服务器设计方案举例

分类: muduo网络库2013-11-04 21:25 930人阅读 评论(0) 收藏 举报

并发服务器多线程reactorthreadpool

一、3点基础知识

1、一个主机的端口号为所有进程所共享,但普通用户进程绑定bind不了一些特殊端口号如20、80等。

多个进程不能同时监听listen同一个端口,会失败。

关注4元组是否能唯一确定一个连接?

2、每个进程都有自己的文件描述符(包括file fd, socket fd, timer fd, event fd, signal fd),一般是1024,可以通过ulimit -n 设置,但所有进程打开的文件描述符总数有上限,跟主机的内存有关。

3、一个进程内的所有线程共享进程的文件描述符。

二、常见并发服务器方案:

1、循环式/迭代式( iterative )服务器
无法充分利用多核CPU,不适合执行时间较长的服务,即适用于短连接。如果是长连接则需要在read/write之间循环,那么只能服务一个客户端。

2、并发式(concurrent)服务器
one connection per process/one connection per thread

适合执行时间比较长的服务

one connection per process : 主进程每次fork 之后要关闭connfd,子进程要关闭listenfd

one connection per thread : 主线程每次accept 回来就创建一个子线程服务,由于线程共享文件描述符,故不用关闭。

3、prefork or pre threaded(UNP2e 第27章)(容易发生“惊群”现象,即多个子进程都处于accept状态)

4、反应式( reactive )服务器 (reactor模式)(select/poll/epoll)
并发处理多个请求,实际上是在一个线程中完成。无法充分利用多核CPU
不适合执行时间比较长的服务,所以为了让客户感觉是在“并发”处理而不是“循环”处理,每个请求必须在相对较短时间内执行。

5、reactor + thread per request(过渡方案)

6、reactor + worker thread(过渡方案)

7、reactor + thread pool(能适应密集计算)

muduo库中的/example/suduku/ 中有这样一个例子,因为数独求解是计算密集型任务。

 

8、multiple reactors(能适应更大的突发I/O)

reactors in threads(one loop per thread)
reactors in processes

一般来说一个subReactor适用于一个千兆网口

9、multiple reactors + thread pool(one loop per thread + threadpool)(突发I/O与密集计算)

subReactor可以有多个,但threadpool只有一个。

10、proactor服务器(proactor模式,基于异步I/O)

理论上proactor比reactor效率要高一些

异步I/O能够让I/O操作与计算重叠。充分利用DMA特性。

Linux异步IO

glibc aio(aio_*),有bug

kernel native aio(io_*),也不完美。目前仅支持 O_DIRECT 方式来对磁盘读写,跳过系统缓存。要自已实现缓存,难度不小。

boost asio实现的proactor,实际上不是真正意义上的异步I/O,底层是用epoll来实现的,模拟异步I/O的。

常见并发服务器方案比较:

三、一些常见问题

1、Linux能同时启动多少个线程?

对于 32-bit Linux,一个进程的地址空间是 4G,其中用户态能访问 3G 左右,而一个线程的默认栈 (stack) 大小是 8M,心算可知,一个进程大约最多能同时启动 350 个线程左右。

2、多线程能提高并发度吗?

如果指的是“并发连接数”,不能。

假如单纯采用 thread per connection 的模型,那么并发连接数大约350,这远远低于基于事件的单线程程序所能轻松达到的并发连接数(几千上万,甚至几万)。所谓“基于事件”,指的是用 IO multiplexing event loop 的编程模型,又称 Reactor 模式。

3、多线程能提高吞吐量吗?

对于计算密集型服务,不能。

如果要在一个8核的机器上压缩100个1G的文本文件,每个core的处理能力为200MB/s,那么“每次起8个进程,一个进程压缩一个文件”与“只启动一个进程(8个线程并发压缩一个文件)”,这两种方式总耗时相当,但是第二种方式能较快的拿到第一个压缩完的文件。

4、多线程能提高响应时间吗?

可以。参考问题3

5、多线程程序日志库要求

线程安全,即多个线程可以并发写日志,两个线程的日志消息不会出现交织。

用一个全局的mutex保护IO

每个线程单独写一个日志文件

前者造成全部线程抢占一个锁(串行写入)
后者有可能让业务线程阻塞在写磁盘操作上。(磁盘IO时间比较长)

解决办法:用一个logging线程负责收集日志消息,并写入日志文件,其他业务线程只管往这个“日志线程”发送日志消息(如通过BlockingQueue提供接口),这称为“异步日志”,也是一个经典的生产者消费者模型。

6、线程池大小的选择

如果池中执行任务时,密集计算所占时间比重为P(0<P<=1),而系统一共有C个CPU,为了让C个CPU跑满而不过载,线程池大小的经验公式T=C/P,即T*P=C(让CPU刚好跑满 )

假设C=8,P=1.0,线程池的任务完全密集计算,只要8个活动线程就能让CPU饱和

假设C=8,P=0.5,线程池的任务有一半是计算,一半是IO,那么T=16,也就是16个“50%繁忙的线程”能让8个CPU忙个不停。

7、线程分类

I/O线程(这里特指网络I/O)
计算线程
第三方库所用线程,如logging,又比如database

常见多线程与并发服务器设计方案举例

时间: 2024-11-09 23:12:14

常见多线程与并发服务器设计方案举例的相关文章

linux网络编程-----&gt;高并发---&gt;多线程并发服务器

做网络服务的时候并发服务端程序的编写必不可少.前端客户端应用程序是否稳定一部分取决于客户端自身,而更多的取决于服务器是否相应时间够迅速,够稳定. 常见的linux并发服务器模型: 多进程并发服务器 多线程并发服务器 select多路I/O转接服务器 poll多路I/O转接服务器 epool多路I/O转接服务器. 本次主要讨论多线程并发服务器模型: 使用多线程模型开发服务时需要考虑以下问题 1.  调整进程内最大文件描述符上限. 2.  线程如有共享数据, 考虑线程同步. 3.  服务于客户端线程

最常见的15个Java多线程,并发面试问题

例如,用于DMA交易的高容量和低延迟电子交易系统通常是并发的.大多数情况下,他们专注于微秒延迟,这就是为什么拥有如何有效地最小化延迟和提高吞吐量知识是如此重要. 这些是我最喜欢的关于Java的线程面试问题.我没有提供这些线程访谈问题的答案,但我会尽可能给你一个提示.我会更新帖子就详细的答案,就像我最近在Java中发布的10个Singleton面试问题一样. 15 Java Thread Interview Questions and answers 无论如何,这里是一些常见的Java多线程和并发

初步谈谈 C# 多线程、异步编程与并发服务器

多线程与异步编程可以达到避免调用线程异步阻塞作用,但是两者还是有点不同. 多线程与异步编程的异同: 1.线程是cpu 调度资源和分配的基本单位,本质上是进程中的一段并发执行的代码. 2.线程编程的思维符合正常人的思维习惯,线程中的处理程序依然是顺序执行,所以编程起来比较方便,但是缺点也是明显的,多线程的使用会造成多线程之间的上下文切换带来系统花销,并且共享变量之间也是会造成死锁的问题. 3.因为异步操作无须额外的线程负担,并且使用回调的方式进行处理,在设计良好的情况下,处理函数可以不必使用共享变

Linux网络编程——tcp并发服务器(多线程)

tcp多线程并发服务器 多线程服务器是对多进程服务器的改进,由于多进程服务器在创建进程时要消耗较大的系统资源,所以用线程来取代进程,这样服务处理程序可以较快的创建.据统计,创建线程与创建进程要快 10100 倍,所以又把线程称为"轻量级"进程.线程与进程不同的是:一个进程内的所有线程共享相同的全局内存.全局变量等信息,这种机制又带来了同步问题. tcp多线程并发服务器框架: 我们在使用多线程并发服务器时,直接使用以上框架,我们仅仅修改client_fun()里面的内容. 代码示例: #

2高并发服务器:多线程服务器

 1多进程并发服务器 在使用线程模型开发服务器时需要考虑以下问题: A 调整进程最大文件描述符上限 B 线程如有共享数据,考虑线程同步 C 服务于客户端线程退出时,退出处理 D 2.案例说明 server.c,代码如下: /* server.c */ #include <stdio.h> #include <string.h> #include <netinet/in.h> #include <arpa/inet.h> #include <pthr

1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架、多线程(并发编程)、I/O(NIO)、Socket、JDBC、XML、反射等。[泛型]\

. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运行环境是一个包含了不同的类和程序的单一进程.线程可以被称为轻量级进程.线程需要较少的资源来创建和驻留在进程中,并且可以共享进程中的资源. 2. 多线程编程的好处是什么? 在多线程程序中,多个线程被并发的执行以提高程序的效率,CPU不会因为某个线程需要等待资源而进入空闲状态. 3. 用户线程和守护线程有什么区别? 当我们在Java

面试题_1_to_16_多线程、并发及线程的基础问题

多线程.并发及线程的基础问题 1)Java 中能创建 volatile 数组吗?能,Java 中可以创建 volatile 类型数组,不过只是一个指向数组的引用,而不是整个数组.我的意思是,如果改变引用指向的数组,将会受到 volatile 的保护,但是如果多个线程同时改变数组的元素,volatile 标示符就不能起到之前的保护作用了. 2)volatile 能使得一个非原子操作变成原子操作吗?一个典型的例子是在类中有一个 long 类型的成员变量.如果你知道该成员变量会被多个线程访问,如计数器

linux网络编程-----&gt;高并发---&gt;多进程并发服务器

在做网络服务的时候并发服务端程序的编写必不可少.前端客户端应用程序是否稳定一部分取决于客户端自身,而更多的取决于服务器是否相应时间够迅速,够稳定. 常见的linux并发服务器模型: 多进程并发服务器 多线程并发服务器 select多路I/O转接服务器 poll多路I/O转接服务器 epool多路I/O转接服务器. 本次主要讨论多线程并发服务器模型: 使用多进程并发服务器时要考虑以下几点: 父进程最大文件描述个数(父进程中需要close关闭accpet返回的新文件描述符) 系统内创建进程个数(与内

大并发服务器开发学习笔记_01大并发服务器架构介绍

大并发服务器架构介绍 一.服务器设计目标(1)高性能(High Performance):快速请求响应:(2)高可用(High Availability):能7X24小时工作,能够进行故障转移:(3)伸缩性(Scalability):能跨机器通信:二.分布式(1)负载均载(2)分布式存储(3)分布式计算 三.C/S结构 任何网络系统都可以抽象为C/S结构 四.一个典型的服务器结构 网络I/O + 服务器高性能编程技术 + 数据库 1.超出数据库连接数:(1)问题描述: 数据库并发连接数10个,应