linux并发服务器设计

linux 并发服务器:

http://blog.csdn.net/ygl840455828ygl/article/details/52438167

http://www.2cto.com/os/201309/245280.html

http://www.cnblogs.com/venow/archive/2012/11/22/2779667.html

http://blog.csdn.net/turkeyzhou/article/details/8609360

1 背景简介

H330S模块集成海兴HXE110/HXE310电表后出现批量无法上线,问题原因在于3G芯片异常(在此不做详细描述),由于客户现场电表大部分已经安装,考虑拆装成本问题需要远程升级。

3G芯片支持foat远程升级,通过控制芯片或主机向3G芯片下发AT指令,激活ppp拨号同时绑定并发服务器IP和端口,3G芯片会主动连接并发FTP服务器进行报文交互升级。WINDOWS版本并发服务器已开发,由于客户现场大部分为LINUX服务器,所以要求开发出LINUX平台下用于H330S升级服务器程序。

2 整体框架说明

2.1 设备关系图

主要有ZTE主站抄表控制系统,通过网页服务器控制电表系统和MCU版本升级程序下发,电表HXE310、HXE110安装覆盖整个国家,FTP服务器为LINUX虚拟机,带宽和内存配置良好位于能源公司机房。

2.2 升级基本流程

如下图所示,从主站上导入MCU升级程序并触发MCU升级事件,主站会下发MCU升级包到电表主控芯片MCU,电表靠3G芯片上网传输数据。MCU升级完成后重启设备同时检测3G芯片版本,若非指定版本则控制3G芯片升级,下发FTP 服务器IP和端口,3G芯片自动与FTP服务程序进行连接升级,数据中断有重连机制。

3 Linux服务器程序设计

3.1 需求说明

1.升级3G芯片并发数量理论值1000个

2.与3G芯片数据包交互稳定采用TCP/IP模型

3.运行环境中CPU 2核以上,内存高于1G,上行带宽高于2M

3.2 服务器模型选型

3.2.1 Select

Select实现I/O端口复用是通过轮询检测I/O事件实现,文件描述符由于机制限制为1024直接限制并发数,I/O事件检测有三种读事件、写事件、异常事件。分别对应读、写、异常三个字符集。

#include <sys/select.h>

int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset,struct timeval *timeout);

3.2.2 Epoll

Epoll I/O多路复用技术是在2.6内核中提出的,是之前的select和poll的增强版本。相对于select和poll来说,epoll更加灵活,没有描述符限制。epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次。

两种工作模式如下:

LT模式:当epoll_wait检测到描述符事件发生并将此事件通知应用程序,应用程序可以不立即处理该事件。下次调用epoll_wait时,会再次响应应用程序并通知此事件。

ET模式:当epoll_wait检测到描述符事件发生并将此事件通知应用程序,应用程序必须立即处理该事件。如果不处理,下次调用epoll_wait时,不会再次响应应用程序并通知此事件。

  ET模式在很大程度上减少了epoll事件被重复触发的次数,因此效率要比LT模式高。epoll工作在ET模式的时候,必须使用非阻塞套接口,以避免由于一个文件句柄的阻塞读/阻塞写操作把处理多个文件描述符的任务饿死。

未采用原因是由于短时间内未调通,该模式最优。不支持windows,linux内核2.6以上,移植性差。

3.2.3 线程池

1.进程中创建线程的限制

默认情况下,一个线程的栈要预留1M的内存空间,而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程,但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小。

2.资源消耗及要求过高,包括内存及处理器,线程创建与销毁,资源分配与释放在实现上比较麻烦

3.短期调试未实现,未采用

3.3 FTP服务程序框架

3.3.1 TCP/IP建立连接

流程图如下:

Step1:ftp server主函初始化

Step2:ftp server创建TCP/IP服务端模型

Step:3:3G modem与FTP进行TCP/IP三次握手

Step4:建立连接后按foat协议栈协议交互升级

3.3.2 FTP SERVER实现

Step1:入参检测,具体格式如下

./gserver 4 10.0.25.151 5050 500 H330S_V2H.00.23.bin modem_success.xls

arg1: Service program of the executable (./gserver)

arg2: Output log level set(default 4)

arg3: Server ip address (eg. xxx.xxx.xxx.xxx) , note that 127.0.0.1 is not allowed

arg4: Server port for upgrade service(eg. 8031), note that this port must be different from the one used by DMS

arg5: The maximum number of access(eg. 50), note that this parameter is affected by the network bandwidth and CPU computing performance

arg6: Upgrade file name (eg. H330S_V2H.00.23.bin)

arg7: The upgrade log file(eg. modem_success.xls) , module‘s upgrading log will be append to this file

Step2:程序初始化

Set_print_log:设置打印级别,0-4一共五个级别,对调试信息,过程信息,错误提示,异常信息,重要日志做出区分。

loadUpdateFiles:加载升级文件到内存,先创建副本文件,后将副本导入到内存。以共享内存方式实现多个事件读取升级文件,保证原文件不被破坏。

Malloc(events):初始化events全局结构体,该结构体的功能是存储所有单个连接客户端的重要属性,包括套接字,ip,port,sn,imei,开始时间,结束时间等

Step3:建立TCP/IP服务器端模型,等待客户端连接

Step4:while循环检测接入客户端

Select:从读写字符集检测事件,带阻塞。包含三种字符集,读事件、写事件、异常事件

Accept:新接入客户端,将fd写入读字符集和写字符集

Recv:非新接入客户端,调用协议栈函数处理业务,若为升级完成指示0X14,从读写字符集中删除客户端fd

3.3.3 守护进程实现

Step1:手动远程到ftp 服务器执行./runstart.sh &后台运行

Step2:若脚本或程序已经运行,提示已经运行或请运行runstop.sh停止程序后再次运行

Step3:若程序运行失败,端口被占用,大量连接未释放导致绑定失败,执行runstop.sh

Step4:while循环检测,120s检测一次若程序异常退出,无可执行程序进程则尝试运行,若失败等120s再次尝试。若程序正常运行,则跳过

原文地址:https://www.cnblogs.com/finn-tang/p/9914520.html

时间: 2024-10-04 02:16:00

linux并发服务器设计的相关文章

网络并发服务器设计---9

网络并发服务器设计 1 #include <stdio.h> 2 #include <sys/types.h> 3 #include <sys/socket.h> 4 #include <string.h> 5 #include <netinet/in.h> 6 7 #include <unistd.h> 8 9 #define portnum 3333 10 11 int main() 12 { 13 int sockfd; 14

网络并发服务器设计

为什么要并发服务器 要让服务器高效同时处理各个请求. a.采用多进程来处理(也可以多线程.或者线程池) tcp_server.c

Linux 并发服务器雏形总结

如下介绍一个并发回射客户端/服务器的雏形,所谓回射:就是客户端输入一条数据,服务器端读取并显示,然后服务器端再把刚读取的信息发送回客户端进行显示.示意图如下: 所谓并发服务器:就是一个服务器可以同时为多个连入的客户端提供服务,示意图如下: 如下主要介绍两种实现并发回射服务器的方式,一种是通过子进程方式实现并发,一种是通过I/O多路转接实现并发. 并发服务器(1)[子进程方式] 1 [[email protected] tcp]# cat echoserv_childprocess.c 2 #in

并发服务器设计

采用多进程来处理 tcp_server_fork.c 1 #include <stdio.h> 2 #include <sys/socket.h> 3 #include <string.h> 4 #include <netinet/in.h> 5 6 #define portnum 3333 7 8 int main() 9 { 10 int sockfd ,new_fd; 11 struct sockaddr_in server_addr; 12 stru

[国嵌攻略][093][并发服务器设计]

server.c #include <sys/socket.h> #include <netinet/in.h> #include <strings.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> #define SERVER_PORT 3333 void main(){ //创建标识 int serverfd; serverfd = socket(AF_IN

LINUX环境并发服务器的三种实现模型

服务器设计技术有很多,按使用的协议来分有TCP服务器和UDP服务器.按处理方式来分有循环服务器和并发服务器. 1  循环服务器与并发服务器模型 在网络程序里面,一般来说都是许多客户对应一个服务器,为了处理客户的请求,对服务端的程序就提出了特殊的要求. 目前最常用的服务器模型有: ·循环服务器:服务器在同一时刻只能响应一个客户端的请求 ·并发服务器:服务器在同一时刻可以响应多个客户端的请求 1.1 UDP循环服务器的实现方法: UDP循环服务器每次从套接字上读取一个客户端的请求->处理->然后将

Linux 网络编程——并发服务器的三种实现模型

服务器设计技术有很多,按使用的协议来分有 TCP 服务器和 UDP 服务器,按处理方式来分有循环服务器和并发服务器. 循环服务器与并发服务器模型 在网络程序里面,一般来说都是许多客户对应一个服务器(多对一),为了处理客户的请求,对服务端的程序就提出了特殊的要求. 目前最常用的服务器模型有: ·循环服务器:服务器在同一时刻只能响应一个客户端的请求 ·并发服务器:服务器在同一时刻可以响应多个客户端的请求 UDP 循环服务器的实现方法 UDP 循环服务器每次从套接字上读取一个客户端的请求 -> 处理

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

一.tcp并发服务器概述 一个好的服务器,一般都是并发服务器(同一时刻可以响应多个客户端的请求).并发服务器设计技术一般有:多进程服务器.多线程服务器.I/O复用服务器等. 二.多进程并发服务器 在 Linux 环境下多进程的应用很多,其中最主要的就是网络/客户服务器.多进程服务器是当客户有请求时,服务器用一个子进程来处理客户请求.父进程继续等待其它客户的请求.这种方法的优点是当客户有请求时,服务器能及时处理客户,特别是在客户服务器交互系统中.对于一个 TCP 服务器,客户与服务器的连接可能并不

Linux 高并发服务器

高并发服务器 一.多进程并发服务器 1. 实现示意图 2. 使用多进程并发服务器时要考虑以下几点: 父进程最大文件描述个数(父进程中需要close关闭accept返回的新文件描述符) 系统内创建进程个数(与内存大小相关) 进程创建过多是否降低整体服务性能(进程调度) 3. 使用多进程的方式, 解决服务器处理多连接的问题:     (1)共享 读时共享, 写时复制 文件描述符 内存映射区 -- mmap     (2)父进程 的角色是什么? 等待接受客户端连接 -- accept 有链接: 创建一