linux 并发服务器:
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再次尝试。若程序正常运行,则跳过

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

  1. Linux 并发服务器编程(多进程)

    文章目录 说明 注意事项 server.c client.c 运行截图 说明 在Linux中通过流式套接字编程(TCP),实现一个并发服务器的访问回显,适合刚学完Linux套接字编程的朋友进行巩固训练 ...

  2. Linux 并发服务器雏形总结

    如下介绍一个并发回射客户端/服务器的雏形,所谓回射:就是客户端输入一条数据,服务器端读取并显示,然后服务器端再把刚读取的信息发送回客户端进行显示.示意图如下: 所谓并发服务器:就是一个服务器可以同时为 ...

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

    服务器设计技术有很多,按使用的协议来分有TCP服务器和UDP服务器.按处理方式来分有循环服务器和并发服务器. 1  循环服务器与并发服务器模型 在网络程序里面,一般来说都是许多客户对应一个服务器,为了 ...

  4. Linux客户/服务器程序设计范式1——并发服务器(多进程)

    引言 本文会写一个并发服务器(concurrent server)程序,它为每个客户请求fork出一个子进程. 注意 1. 信号处理问题 对于相同信号,按信号的先后顺序依次处理.可能会产生的问题是,正 ...

  5. Linux + C + Epoll实现高并发服务器(线程池 + 数据库连接池)(转)

    转自:http://blog.csdn.net/wuyuxing24/article/details/48758927 一, 背景 先说下我要实现的功能,server端一直在linux平台下面跑,当客 ...

  6. Linux网络编程客户\服务器设计范式

    1.前言 网络编程分为客户端和服务端,服务器通常分为迭代服务器和并发服务器.并发服务器可以根据多进程或多线程进行细分,给每个连接创建一个独立的进程或线程,或者预先分配好多个进程或线程等待连接的请求.今 ...

  7. Linux网络编程服务器模型选择之并发服务器(上)

    与循环服务器的串行处理不同,并发服务器对服务请求并发处理.循环服务器只能够一个一个的处理客户端的请求,显然效率很低.并发服务器通过建立多个子进程来实现对请求的并发处理.并发服务器的一个难点是如何确定子 ...

  8. Linux下几种并发服务器的实现模式

    Linux下的几种并发服务器的设计模式 1>单线程或者单进程 相当于短链接,当accept之后,就开始数据的接收和数据的发送,不接受新的连接,即一个server,一个client 不存在并发. ...

  9. linux学习之高并发服务器篇(二)

    高并发服务器 1.线程池并发服务器 两种模型: 预先创建阻塞于accept多线程,使用互斥锁上锁保护accept(减少了每次创建线程的开销) 预先创建多线程,由主线程调用accept 线程池 3.多路 ...

随机推荐

  1. 修复/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory问题

    在配置MongDB的是时候出现这/lib/ld-linux.so.2问题 [root@localhost local]# /usr/local/mongodb/mongodb/bin/mongod - ...

  2. C++与C的联系与区别

    C++与C的联系: C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛.C++支持多种编程范式 --面向对象编程.泛型编程和过程化编程. 其编程领域众广,常用于系统开发,引擎开发等应用领域, ...

  3. RocketMq(一)初识消息中间件

    1.对消息的理解 消息即为数据(data),数据有一定的规则.长度.大小. Java Message Service(Java消息服务)简称JMS,为Java 程序提供一种通用的方式,来创建.发送.接 ...

  4. Docker概念学习系列之Docker核心概念之仓库Repository

    不多说,直接上干货! Docker仓库 仓库(Repository)是集中存放镜像的地方,分公共仓库和私有仓库. 仓库是集中存放镜像文件的场所. 有时候会把仓库和仓库注册服务器(Registry)混为 ...

  5. 复刻smartbits的国产网络测试工具minismb-如何添加数据流

    复刻smartbits的国产网络性能测试工具minismb,是一款专门用于测试智能路由器,网络交换机的性能和稳定性的软硬件相结合的工具.可以通过此工具测试任何ip网络设备的端口吞吐率,带宽,并发连接数 ...

  6. Code First, Database First, Same Time区别

    Code First, Database First, Same Time是我理解的asp.net mvc中用到的三种model与数据库对应的方式,肯定是不全面的,理解也有些狭隘,今后随着自己的理解加 ...

  7. C++ STL 学习

    /* algorithm-算法 */ .copy() //此函数用在vector中只做拷贝使用,它不能让vector有自动扩充作用.如果vector的容量小于它拷贝的数据量将会报错. /* itera ...

  8. c# List< int>和List< string>互相转换

    c# List< int>和List< string>互相转换 定义一个list< t> List<int> list = new List<in ...

  9. Java并发编程:什么是线程安全,以及并发必须知道的几个概念

    废话 众所周知,在Java的知识体系中,并发编程是非常重要的一环,也是面试的必问题,一个好的Java程序员是必须对并发编程这块有所了解的.为了追求成为一个好的Java程序员,我决定从今天开始死磕Jav ...

  10. 使用Hibernate Validator来帮你做数据校验

    数据校验是贯穿所有应用程序层(从表示层到持久层)的常见任务.通常在每个层中实现相同的验证逻辑,这是耗时且容易出错的.这里我们可以使用Hibernate Validator来帮助我处理这项任务.对此,H ...