如何不使用任何模型裸建服务器

简介: 如何不使用任何模型裸建服务器

裸建服务器的问题较多,但是作为后端程序员依然有必要了解,以便更深刻地理解为什么要使用IO多路复用模型、异步模型等。

前导知识

网络IO:在计算机网络中进行数据的输入/输出(Input/Output)的操作,可以是由本地程序发送给本地程序,也可以是由多台不同主机上的程序进行操作。

网络IO的步骤:1、建立连接。2、接收数据(I)/准备数据(O)。3、数据处理(I)/发送数据(O)。

IP与网卡:网卡是接收数据的硬件设备。一台主机可能有多张网卡,一张网卡一般对应一个IP地址。IP地址127.0.0.1,一般用于同一张网卡之间内部进行IO。IP地址为0.0.0.0,一般表示本机所有的网卡的IP的集合。IP地址为非127.0.0.1,非0.0.0.0,一般是某张网卡的IP。

建立服务端——基于TCP协议

建立一个发送什么什么,就会返回什么数据的服务端。

建立服务端套接字

首先需要建立套接字。这个套接字有什么作用呢?打个比方,一个客户要和服务中心建立通信关系,那么客户先给这个“服务端套接字”发送消息说“我想和服务中心建立通信”,这个“服务端套接字”走了一下流程,发现没问题,于是就允许二者建立他们的通信线路。

int socket(int domain, int type, int protocol);第一个参数表示地址族,第二个参数表示套接字类型(一般决定是tcp协议还是udp协议),第三个参数通常是0,表示根据第二个套接字自动选择协议。

设置服务端套接字的信息

我们一般先把信息存储在一个结构体实例中,然后通过再把这个结构体实例通过bind函数绑定给套接字。如果是ipv4地址用struct sockaddr_in,如果是ipv6地址用struct sockaddr_in6。INADDR_ANY表示0.0.0.0这个IP。套接字一般分为两部分,一部分在用户空间,一部分在内核空间。在用户空间体现为一个数字,一个文件标识符,在内核空间被实现为一个结构体,用于管理网络通信的底层细节。

把套接字信息与套接字绑定

成功返回0,失败返回-1。

让套接字进入监听状态

第二个参数表示等待队列的长度,也就是最多能同时监听多少个来自客户端的接入请求。在等待队列中的监听请求已经进入了被监听状态,但是流程未走完。

客户端发起连接请求

推荐一个客户端连接工具:TCP/UDP Net Assistant

建立连接是不需要代码显式参与的。

在服务端用linux命令查看连接成功与否

可以看到服务端的监听端口有两个状态,一个是LISTEN,一个是ESTABLISHD。ESTABILISHD那一行记录了客户端的IP和port。

服务端接收数据

网络连接建立成功之后,服务端已经能接受信息了。但是还需要专门的操作把消息读取出来。

首先需要建立一个新的套接字,把客户端与服务端套接字的通信,转移到另一个套接字上去,并实现专门的接受报文的功能。

建立一个结构体,用于存储客户端的相关信息,比如IP,port等。补充:clientid是在stdin,stdout,stderr,socketfd的基础上依次增加的。

然后就调用recv函数通过新的套接字接收数据了。需要先准备好一块接受数据的空间。如果没有数据发送,会被阻塞住。

     

返回值是接收到的数据的长度。

发送接收到的数据

sned函数第二个参数是发送的数据的长度。如果buffer数据没准备好会被阻塞住。

clientfd的回收

查看连接的状态,刚调用close的时候,连接先进入timewait状态,因为服务端可能需要一些时间处理未完的数据,等待一段时间后会彻底关闭连接。

如果服务端出现了大量的timewait,原因大概率是服务端因为某些原因崩溃、不运行等,与大部分甚至所有客户端进行断开操作。当然,也有可能是主动断开。

用循环改进服务端——能持续接受并返回一个客户端的报文

上一版的代码是只能一次性接受并发回数据,将数据处理这部分改为while循环,可实现能持续接收并返回一个客户端的报文。

但是上述改进有一个问题:如果断开了连接,没办法进行close(fd)。因此需要加一个判断,判断客户端断开了连接,并跳出循环,进行close操作。

如果客户端已经断开了连接,但是close操作被阻塞住,那么tcp连接会进入close_wait状态。Close wait状态下客户端能重连接,但是服务端没法再进行数据处理了。

插图

用多线程改进服务端——能持续接收并返回多个客户端的报文

来一个连接,就建立一个线程进行处理。

因此,如果有1w个,就建立1w个线程。会非常地不利于大量并发。也就是传说中C10K的问题。

基于上述原因,建议服务端使用一些模型。

目录
相关文章
|
8月前
|
存储 弹性计算 安全
ECS的安全责任共担模型
云服务器ECS的云上安全性是阿里云和客户的共同责任。本文介绍云服务器ECS(Elastic Compute Service)与客户在安全性方面各自应该承担的责任。
|
3月前
|
数据可视化 Linux 网络安全
如何使用服务器训练模型
本文介绍了如何使用服务器训练模型,包括获取服务器、访问服务器、上传文件、配置环境、训练模型和下载模型等步骤。适合没有GPU或不熟悉Linux服务器的用户。通过MobaXterm工具连接服务器,使用Conda管理环境,确保训练过程顺利进行。
202 0
如何使用服务器训练模型
|
3月前
|
存储 PyTorch API
NVIDIA Triton系列09-为服务器添加模型
本文介绍了如何为NVIDIA Triton模型仓库添加新模型。通过示例模型`inception_graphdef`的配置文件`config.pbtxt`,详细解释了模型名称、平台/后端名称、模型执行策略、最大批量值、输入输出节点及版本策略等配置项。内容涵盖了模型的基本要素和配置细节,帮助读者更好地理解和使用Triton服务器。
46 0
|
3月前
|
机器学习/深度学习 人工智能 并行计算
StableDiffusion-01本地服务器部署服务 10分钟上手 底显存 中等显存机器 加载模型测试效果 附带安装指令 多显卡 2070Super 8GB*2
StableDiffusion-01本地服务器部署服务 10分钟上手 底显存 中等显存机器 加载模型测试效果 附带安装指令 多显卡 2070Super 8GB*2
59 0
|
4月前
|
网络协议 数据处理 C语言
利用C语言基于poll实现TCP回声服务器的多路复用模型
此代码仅为示例,展示了如何基于 `poll`实现多路复用的TCP回声服务器的基本框架。在实际应用中,你可能需要对其进行扩展或修改,以满足具体的需求。
111 0
|
5月前
|
开发工具 git iOS开发
服务器配置Huggingface并git clone模型和文件
该博客提供了在服务器上配置Huggingface、安装必要的工具(如git-lfs和huggingface_hub库)、登录Huggingface以及使用git clone命令克隆模型和文件的详细步骤。
496 1
|
7月前
|
机器学习/深度学习 人工智能 网络安全
人工智能平台PAI产品使用合集之在本地可以成功进入模型流,但在服务器上无法进入,是什么原因
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
7月前
|
异构计算 弹性计算 并行计算
|
8月前
|
测试技术 PyTorch 算法框架/工具
魔搭开源推理引擎 DashInfer,助力CPU服务器解锁大模型超强推理
ModelScope推出了预训练大语言模型(LLM)推理引擎DashInfer,采用C++ Runtime编写,提供C++和Python语言接口,具有生产级别的高性能表现,适用于多种CPU架构,包括x86和ARMv9。DashInfer支持连续批处理(Continuous Batching)和多NUMA推理(NUMA-Aware),能够充分利用服务器级CPU的算力,为推理14B及以下的LLM模型提供更多的硬件选择。该项工作已开源。
|
7月前
使用高性能服务器训练StableDiffusion——人物模型.safetensors
使用高性能服务器训练StableDiffusion——人物模型.safetensors
71 0