- 单进程服务,使用非阻塞IO
使用一个进程服务多个客户,通常与客户通信的套接字设置为非阻塞的,阻塞只发生在select()、poll()、epoll_wait()等系统调用上面。这是一种行之有效的单进程状态机式服务方式,已被广泛采用。
缺点是它无法利用SMP(对称多处理器)的优势,除非启动多个进程。此外,它尝试就绪的IO文件描述符后,立即从系统调用返回,这会导致大量的系统调用发生,尤其是在较慢的字节传输时。
select()本身的实现也是有局限的:能打开的文件描述符最多不能超过FD_SETSIZE,很容易耗尽;每次从select()返回的描述符组中扫描就绪的描述符需要时间,如果就绪的描述符在末尾时更是如此(epoll特别彻底修复了这个问题)。
- 多进程服务,使用阻塞IO
也称作 accept/fork 模型,每当有客户连线时产生一个新的进程为之服务。这种方式有时是必要的,比如可以通过操作系统获得良好的内存保护,可以以不同的用户身份运行程序,可以让服务运行在不同的目录下面。但是它的缺点也很明显:进程比较占资源,进程切换开销太大,共享某些信息比较麻烦。Apache 1.3就使用了这种模型,MaxClients数很容易就可以达到。
所谓并发服务器就是在同一个时刻可以处理来自多个客户端的请求循环服务器是指服务器在同一时刻只可以响应一个客户端的请求。而且对于TCP和UDP套接字,这两种服务器的实现方式也有不同的特点。1、TCP循环服务器:
首先TCP服务器接受一个客户端的连接请求,处理连接请求,在完成这个客户端的所有请求后断开连接,然后再接受下一个客户端的请求。创建TCP循环服务器的算法如下:
复制代码 代码如下:
socket(……)//创建一个TCP套接字
bind(……)//邦定公认的端口号
listen(……)//倾听客户端连接
while(1) //开始循环接收客户端连接
{
accept(……)//接收当前客户端的连接
while(1)
{ //处理当前客户端的请求
read(……)
process(……)
write(……)
}
close(……)//关闭当前客户端的连接,准备接收下一个客户端连接
}
TCP循环服务器一次只处理一个客户端的请求,如果有一个客户端占用服务器不放时,其它的客户机连接请求都得不到及时的响应。因此,TCP服务器一般很少用循环服务器模型的。
2、TCP并发服务器:
并发服务器的思想是每一个客户端的请求并不由服务器的主进程直接处理,而是服务器主进程创建一个子进程来处理。创建TCP并发服务器的算法如下:
复制代码 代码如下:
socket(……)//创建一个TCP套接字
bind(……)//邦定公认的端口号
listen(……)//倾听客户端连接
while(1) //开始循环接收客户端的接收
{
accept(……)//接收一个客户端的连接
if(fork(……)==0) //创建子进程
{
while(1)
{ //子进程处理某个客户端的连接
read(……)
process(……)
write(……)
}
close(……)//关闭子进程处理的客户端连接
exit(……) //终止该子进程
}
close(……)//父进程关闭连接套接字描述符,准备接收下一个客户端连接
}
TCP并发服务器可以解决TCP循环服务器客户端独占服务器的情况。但同时也带来了一个不小的问题,即响应客户机的请求,服务器要创建子进程来处理,而创建子进程是一种非常消耗资源的操作。
3、UDP循环服务器:
UDP服务器每次从套接字上读取一个客户端的数据报请求,处理接收到的UDP数据报,然后将结果返回给客户机。创建UDP循环服务器的算法如下:
1 socket(……)//创建一个数据报类型的套接字 2 bind(……)//邦定公认的短口号 3 while(1) //开始接收客户端的连接 4 { //接收和处理客户端的UDP数据报 5 recvfrom(……)6 process(……)7 sendto(……)//准备接收下一个客户机的数据报 8 }
消除行号
因为UDP是非面向连接的,没有一个客户端可以独占服务器。只要处理过程不是死循环,服务器对于每一个客户机的请求总是能够处理的。
UDP循环服务器在数据报流量过大时由于处理任务繁重可能造成客户技数据报丢失,但是因为UDP协议本身不保证数据报可靠到达,所以UDP协议是允许丢失数据报的。
鉴于以上两点,一般的UDP服务器采用循环方式4、UDP并发服务器把并发的概念应用UDP就得到了并发UDP服务器,和并发TCP服务器模型一样是创建子进程来处理的。
创建UDP并发服务器的算法如下:
复制代码 代码如下:
socket(……)//创建一个数据报类型的套接字
bind(……)//邦定公认的短口号
while(1) //开始接收客户端的连接
{ //接收和处理客户端的UDP数据报
recvfrom(……)
if(fork(……)==0) //创建子进程
{
rocess(……)
sendto(……)
}
}
除非服务器在处理客户端的请求所用的时间比较长以外,人们实际上很少用这种UDP并发服务器模型的。
4、多路复用I/O并发服务器:
创建子进程会带来系统资源的大量消耗,为了解决这个问题,采用多路复用I/O模型的并发服务器。采用select函数创建多路复用I/O模型的并发服务器的算法如下:
初始化(socket,bind,listen)
复制代码 代码如下:
while(1)
{
设置监听读写文件描述符(FD_*)
调用select
如果是倾听套接字就绪,说明一个新的连接请求建立
{
建立连接(accept)
加入到监听文件描述符中去
}
否则说明是一个已经连接过的描述符
{
进行操作(read或者write)
}
多路复用I/O可以解决资源限制问题,此模型实际上是将UDP循环模型用在了TCP上面。这也会带了一些问题,如由于服务器依次处理客户的请求,所以可能导致友的客户会等待很久。
如下图
不过要注意以下几点 :
如下图:1个master(192.168.171.128) 2个slave(192.168.171.131 192.168.171.133) 这些都是虚拟机ip
Target是部署于同一个局域网中的UDP服务器(10.100.50.127)
下面我们来演示一下如何配置SSL
如果是在windows上,则执行bin/create-rmi-keystore.bat。执行完成后会生成一个文件rmi_keystore.jks。圣后这个文件后,保证每一个Jmeter宿主机上都使用的是这个文件
所有的宿主机都要安装Jmeter并配置环境变量
1.将Jmeter压缩包上传到所有的宿主机上。解压后的目录为/opt/software/jmeter/apache-jmeter-4.0
2.配置环境变量
配置好之后需要测试一下
如果提示没有权限,就把bin目录的文件加一下执行权限就好了
做好上面的两步后,slave只需要启动一下jmeter-server就可以了
也可以指定ip运行
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)