国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

高并發(fā)服務(wù)器的限制有哪些,如何提高并發(fā)量

這篇具有很好參考價(jià)值的文章主要介紹了高并發(fā)服務(wù)器的限制有哪些,如何提高并發(fā)量。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

前言

并發(fā)量限制因素 (五元組)

準(zhǔn)備

測(cè)試并發(fā)量

思考局限

如何打破

超時(shí)連接問(wèn)題何在

connection timeout的解決辦法

實(shí)際開(kāi)發(fā)中的處理方案

文章小結(jié)


前言

本文純粹就是小杰學(xué)習(xí)后端服務(wù)器開(kāi)發(fā)的一個(gè)學(xué)習(xí)筆記系列.
小杰會(huì)盡量地將其梳理清楚, 大家一起學(xué)習(xí),共同進(jìn)步, 知識(shí)不分高低, 計(jì)算機(jī)的學(xué)習(xí)小杰認(rèn)為也是一個(gè) ? ?
量變 ? ---> ? 質(zhì)變 ? ?的過(guò)程
天道酬勤, 水滴石穿, 在不同的階段就干好自己當(dāng)前階段力所能及之事, ?至少是沒(méi)有在寢室的床上癱著消磨時(shí)光 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? -------- ? 愿大家都學(xué)有所成,所獲

并發(fā)量限制因素 (五元組)

五元組: (srcip, dstip, srcport, dstport, proto)?

  1. 文件句柄, 文件描述符數(shù)量? open files
  2. 系統(tǒng)內(nèi)存限制?
  3. 端口數(shù)量限制
  4. 網(wǎng)絡(luò)帶寬的限制 (一般不做考慮)
  5. 數(shù)據(jù)庫(kù)的并發(fā)量限制

準(zhǔn)備

先將 open files 修改到 100W的上限

查看單個(gè)進(jìn)程可以打開(kāi)的文件句柄的數(shù)目, open files的大小

命令:ulimit?

ulimit -a 顯示當(dāng)前所有的資源限制
ulimit -H 設(shè)置硬件資源限制
ulimit -S 設(shè)置軟件資源限制
ulimit -n 設(shè)置進(jìn)程最大打開(kāi)文件描述符數(shù)

服務(wù)器高并發(fā),后端服務(wù)器開(kāi)發(fā),網(wǎng)絡(luò),服務(wù)器,測(cè)試,學(xué)習(xí),并發(fā)量

我的已經(jīng)被我自己修改為了100W的量級(jí)了?

修改方式:

  1. 命令修改?: ulimit -n? <value>? ? 缺陷:不是永久修改, 不涉及寫(xiě)磁盤(pán), 重啟shell之后修改消失
  2. 修改配置文件??limits.conf 文件限制著用戶可以使用的最大文件數(shù),最大線程,最大內(nèi)存等資源使用量。??? vim /etc/security/limits.conf? ? ? ? 涉及寫(xiě)磁盤(pán), 每一次登錄shell都會(huì)加載配置文件, 永久修改? ? ? ? ?配置文件記憶技巧, 資源使用限制涉及到系統(tǒng)安全, 故而在security中

服務(wù)器高并發(fā),后端服務(wù)器開(kāi)發(fā),網(wǎng)絡(luò),服務(wù)器,測(cè)試,學(xué)習(xí),并發(fā)量

服務(wù)器高并發(fā),后端服務(wù)器開(kāi)發(fā),網(wǎng)絡(luò),服務(wù)器,測(cè)試,學(xué)習(xí),并發(fā)量

測(cè)試并發(fā)量

首先針對(duì)之前寫(xiě)的reactor進(jìn)行一個(gè)并發(fā)量的測(cè)試.

測(cè)試代碼server代碼在上一篇文章中:

epoll高度封裝reactor,幾乎所有可見(jiàn)服務(wù)器的底層框架_小杰312的博客-CSDN博客_小杰框架epoll高度封裝reactor,幾乎所有可見(jiàn)服務(wù)器的底層框架https://blog.csdn.net/weixin_53695360/article/details/123894158?spm=1001.2014.3001.5502

并發(fā)量:服務(wù)器可以承載的客戶端的連接數(shù)量, 也就是可以維護(hù)的 sockfd的數(shù)量.

客戶端并發(fā)量測(cè)試

初始版本測(cè)試結(jié)果如下:

服務(wù)器高并發(fā),后端服務(wù)器開(kāi)發(fā),網(wǎng)絡(luò),服務(wù)器,測(cè)試,學(xué)習(xí),并發(fā)量

思考局限

srcip 客戶端的ip是固定的 srcport 客戶端的可用端口數(shù)理論值是?65535

dstip +??dstport 固定, 服務(wù)器ip 跟 端口固定

?此時(shí)并發(fā)量可以達(dá)到2.8W, 然后報(bào)錯(cuò)不能分配地址了. 其實(shí)是客戶端端口分配上限了.

如何打破

增加服務(wù)器端口數(shù),? 此時(shí)完全先從五元組確定唯一連接的方向切入,思考出可以增加服務(wù)端的監(jiān)視窗口數(shù)量來(lái)提高并發(fā)量, 打破限制.? ? ? ?(多端口, 多窗口監(jiān)視,有效提升客戶接入量)

  • 將服務(wù)器的端口數(shù)開(kāi)啟到100個(gè)
  • 核心改變代碼:

創(chuàng)建監(jiān)視端口 init_listen_sock

int init_sock(short port) {

	int sockfd = socket(AF_INET, SOCK_STREAM, 0);
	if (sockfd == -1) {
		err_exit("socket");
	}

	sockaddr_in addr;

	memset(&addr, 0, sizeof(addr));
	addr.sin_port = htons(port);
	addr.sin_family = AF_INET;
	addr.sin_addr.s_addr = INADDR_ANY;

	if (-1 == bind(sockfd, (SA*)&addr, sizeof(addr))) {
		err_exit("bind");
	}

	if (-1 == listen(sockfd, 5)) {
		err_exit("listen");
	}

	return sockfd;
}
	//循環(huán)向eventloop中添加多監(jiān)視窗口, 多port
    int i = 0;
	for (i = 0; i < LISTEN_PORT; ++i) {
		sockfd = init_sock(i + port);
		//將其加入到event_loop中
		struct epoll_event ev;
		ev.events = EPOLLIN;	//level 觸發(fā) 
		//注冊(cè)監(jiān)視事件
		struct sockitem* si = (struct sockitem*)malloc(sizeof(struct sockitem));
		si->sockfd = sockfd;
		si->callback = accept_cb;//設(shè)置事件處理器

		ev.data.ptr = si;
		epoll_ctl(eventloop->epfd, EPOLL_CTL_ADD, sockfd, &ev);
	}
  • 再測(cè)試

經(jīng)過(guò)漫長(zhǎng)等待之后它終于還是沒(méi)有達(dá)到100W左右, 而是killed了, 因?yàn)閮?nèi)存限制被killed了

服務(wù)器高并發(fā),后端服務(wù)器開(kāi)發(fā),網(wǎng)絡(luò),服務(wù)器,測(cè)試,學(xué)習(xí),并發(fā)量

其實(shí)這個(gè)不是正常現(xiàn)象,我這里是因?yàn)閮?nèi)存限制而產(chǎn)生了killed, 實(shí)際上,內(nèi)存限制沒(méi)有打破的情況下也還是無(wú)法達(dá)到100W, 會(huì)出現(xiàn)? ? connection timeout 連接超時(shí)的錯(cuò)誤?

超時(shí)連接問(wèn)題何在

100 * 2.8W? 服務(wù)端端口數(shù)(100端口)?* 客戶端端口數(shù) (隨機(jī)2.8W端口, 之前測(cè)試)?可以達(dá)到100W,所以接入量的限制不是五元組. 而是其他因素

針對(duì)connect的超時(shí)連接錯(cuò)誤, 我們透過(guò)TCP三次握手去看, 問(wèn)題在于服務(wù)端沒(méi)有向客戶端返回一個(gè)ACK, 導(dǎo)致了connect 超時(shí).? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?---?server 的ACK為何沒(méi)有到

此時(shí)的限制其實(shí)在于協(xié)議棧了. iptables, 一種過(guò)濾裝置? 防火墻

服務(wù)器高并發(fā),后端服務(wù)器開(kāi)發(fā),網(wǎng)絡(luò),服務(wù)器,測(cè)試,學(xué)習(xí),并發(fā)量

connection timeout的解決辦法

修改??/etc/sysctl.conf?配置文件, 打破限制.

net.nf_conntrack_max 就是防火墻的限制

fs.file-max = 1048576        
net.nf_conntrack_max = 1048576
net.ipv4.tcp_rmem =128 256 512
net.ipv4.tcp_wmem =128 256 512

至此其實(shí)可以完成百萬(wàn)接入量了, 只是我的服務(wù)器內(nèi)存是在太小, 無(wú)法達(dá)到要求, 內(nèi)存足夠是可以跑到100W的.

服務(wù)器高并發(fā),后端服務(wù)器開(kāi)發(fā),網(wǎng)絡(luò),服務(wù)器,測(cè)試,學(xué)習(xí),并發(fā)量

實(shí)際開(kāi)發(fā)中的處理方案

采用多進(jìn)程的方式, 而不是多端口的方式.

測(cè)試代碼:? ?MAX_PORT : 代表的是端口數(shù), 與服務(wù)器端口數(shù)保持一致文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-702935.html

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/epoll.h>
#include <errno.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <fcntl.h>

#define MAX_BUFFER		128
#define MAX_EPOLLSIZE	(384*1024)
#define MAX_PORT		1


#define TIME_SUB_MS(tv1, tv2)  ((tv1.tv_sec - tv2.tv_sec) * 1000 + (tv1.tv_usec - tv2.tv_usec) / 1000)

int isContinue = 0;

static int ntySetNonblock(int fd) {
	int flags;

	flags = fcntl(fd, F_GETFL, 0);
	if (flags < 0) return flags;
	flags |= O_NONBLOCK;
	if (fcntl(fd, F_SETFL, flags) < 0) return -1;
	return 0;
}

// s設(shè)置好地址可復(fù)用
static int ntySetReUseAddr(int fd) {
	int reuse = 1;
	return setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(reuse));
}


int main(int argc, char **argv) {
	if (argc <= 2) {
		printf("Usage: %s ip port\n", argv[0]);
		exit(0);
	}

	const char *ip = argv[1];
	int port = atoi(argv[2]);
	int connections = 0;
	char buffer[128] = {0};
	int i = 0, index = 0;

	struct epoll_event events[MAX_EPOLLSIZE];
	
	int epoll_fd = epoll_create(MAX_EPOLLSIZE);
	
	strcpy(buffer, " Data From MulClient\n");
		
	struct sockaddr_in addr;
	memset(&addr, 0, sizeof(struct sockaddr_in));
	
	addr.sin_family = AF_INET;
	addr.sin_addr.s_addr = inet_addr(ip);

	struct timeval tv_begin;
	gettimeofday(&tv_begin, NULL);

	while (1) {
		if (++index >= MAX_PORT) index = 0;
		
		struct epoll_event ev;
		int sockfd = 0;

		if (connections < 340000 && !isContinue) {
			sockfd = socket(AF_INET, SOCK_STREAM, 0);
			if (sockfd == -1) {
				perror("socket");
				goto err;
			}

			//ntySetReUseAddr(sockfd);
			addr.sin_port = htons(port+index);

			if (connect(sockfd, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)) < 0) {
				perror("connect");
				goto err;
			}
			ntySetNonblock(sockfd);
			ntySetReUseAddr(sockfd);

			sprintf(buffer, "Hello Server: client --> %d\n", connections);
			send(sockfd, buffer, strlen(buffer), 0);

			ev.data.fd = sockfd;
			ev.events = EPOLLIN | EPOLLOUT;
			epoll_ctl(epoll_fd, EPOLL_CTL_ADD, sockfd, &ev);
		
			connections ++;
		}
		//connections ++;
		if (connections % 1000 == 999 || connections >= 340000) {
			struct timeval tv_cur;
			memcpy(&tv_cur, &tv_begin, sizeof(struct timeval));
			
			gettimeofday(&tv_begin, NULL);
			//計(jì)算出時(shí)間
			int time_used = TIME_SUB_MS(tv_begin, tv_cur);
			printf("connections: %d, sockfd:%d, time_used:%d\n", connections, sockfd, time_used);
			//每一次僅僅只是拿出來(lái)
			int nfds = epoll_wait(epoll_fd, events, connections, 100);
			for (i = 0;i < nfds;i ++) {
				int clientfd = events[i].data.fd;

				if (events[i].events & EPOLLOUT) {
					sprintf(buffer, "data from %d\n", clientfd);
					send(sockfd, buffer, strlen(buffer), 0);
				} else if (events[i].events & EPOLLIN) {
					char rBuffer[MAX_BUFFER] = {0};				
					ssize_t length = recv(sockfd, rBuffer, MAX_BUFFER, 0);
					if (length > 0) {
						printf(" RecvBuffer:%s\n", rBuffer);

						if (!strcmp(rBuffer, "quit")) {
							isContinue = 0;
						}
						
					} else if (length == 0) {
						printf(" Disconnect clientfd:%d\n", clientfd);
						connections --;
						close(clientfd);
					} else {
						if (errno == EINTR) continue;

						printf(" Error clientfd:%d, errno:%d\n", clientfd, errno);
						close(clientfd);
					}
				} else {
					printf(" clientfd:%d, errno:%d\n", clientfd, errno);
					close(clientfd);
				}
			}
		}

		usleep(1 * 1000);
	}

	return 0;

err:
	printf("error : %s\n", strerror(errno));
	return 0;
	
}

文章小結(jié)

  1. 做并發(fā)測(cè)試時(shí)候出現(xiàn)了問(wèn)題,我們思考的方式是: 內(nèi)存限制,? open files 文件句柄數(shù)限制,? 五元組組合限制, 網(wǎng)絡(luò)帶寬, 數(shù)據(jù)庫(kù)... 方向入手思考
  2. 對(duì)于各種系統(tǒng)資源的限制, 可以通過(guò)修改配置文件的方式做出永久修改? ?/etc/security/limits.conf? ? ? ?+? ? ?/etc/sysctl.conf??
  3. 五元組組合限制? ? ? 防火墻限制
  4. ulimit -a 查看所有的資源限制, free -h 查看內(nèi)存限制, htop 動(dòng)態(tài)觀察CPU? + 內(nèi)存占用情況, 便于分析異常

到了這里,關(guān)于高并發(fā)服務(wù)器的限制有哪些,如何提高并發(fā)量的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 如何增加服務(wù)器的高并發(fā)

    如何增加服務(wù)器的高并發(fā)

    隨著互聯(lián)網(wǎng)的快速發(fā)展和普及,越來(lái)越多的應(yīng)用程序需要支持高并發(fā)的請(qǐng)求處理。在這種情況下增加服務(wù)器的高并發(fā)能力成為了一個(gè)熱門(mén)的話題。下面簡(jiǎn)單的介紹如果提高服務(wù)器的高并發(fā)能力。 負(fù)載均衡 是把請(qǐng)求分發(fā)到多個(gè)服務(wù)器上,來(lái)實(shí)現(xiàn)請(qǐng)求的平衡和分擔(dān)。負(fù)載均衡可

    2024年01月16日
    瀏覽(19)
  • 如何調(diào)整Hostease服務(wù)器cPanel中的域名數(shù)量限制

    如何調(diào)整Hostease服務(wù)器cPanel中的域名數(shù)量限制

    近段時(shí)間我們的網(wǎng)站總是受到攻擊,為了保障網(wǎng)站的安全,我們準(zhǔn)備將所有網(wǎng)站遷移至Hostease提供的高防服務(wù)器中。我們的服務(wù)器配置是Intel I3 - 2120,8GB 內(nèi)存 1TB 機(jī)械硬盤(pán),100M 帶寬出口,外加10G 防御的防御,服務(wù)器配置了cPanel面板。 我們?cè)赪HM面板中新建了cPanel賬戶后,發(fā)現(xiàn)

    2024年04月27日
    瀏覽(16)
  • 高并發(fā)大游戲如何選擇阿里云服務(wù)器配置?

    阿里云服務(wù)器配置如何選擇?用于高性能計(jì)算或大游戲并發(fā),可選擇企業(yè)級(jí)第七代云服務(wù)器計(jì)算型g7、ECS計(jì)算型c7、內(nèi)存型r7獨(dú)享型云服務(wù)器,CPU采用第三代Intel Xeon可擴(kuò)展處理器(Ice Lake),基頻2.7 GHz,全核睿頻3.5 GHz,計(jì)算性能穩(wěn)定?;顒?dòng) https://t.aliyun.com/U/bLynLC 第七代云服務(wù)

    2024年01月21日
    瀏覽(24)
  • 輕量應(yīng)用服務(wù)器和云服務(wù)器有哪些區(qū)別,該如何選擇?

    輕量應(yīng)用服務(wù)器和云服務(wù)器有哪些區(qū)別,該如何選擇?

    我們很多朋友看到阿里云和騰訊云有在促銷活動(dòng)云服務(wù)器的時(shí)候,有云服務(wù)器和輕量服務(wù)器,而且我們看到大部分時(shí)候輕量服務(wù)器是比較便宜的。這個(gè)有一定的因素是輕量服務(wù)器是新出來(lái)的促銷力度大一些,二來(lái)輕量服務(wù)器是面向基礎(chǔ)用戶的所以便宜一點(diǎn)。輕量應(yīng)用服務(wù)器和

    2024年02月01日
    瀏覽(30)
  • 服務(wù)器的安全包括哪些方面-服務(wù)器安全該如何去加固處理-

    服務(wù)器的安全包括哪些方面-服務(wù)器安全該如何去加固處理-

    服務(wù)器安全包括如下幾個(gè)方面: 系統(tǒng)安全:包括操作系統(tǒng)的安全性、系統(tǒng)的漏洞和補(bǔ)丁管理、用戶管理、文件權(quán)限和訪問(wèn)控制等。 網(wǎng)絡(luò)安全:包括網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)、網(wǎng)絡(luò)設(shè)備的安全性、網(wǎng)絡(luò)協(xié)議的安全性、防火墻和入侵檢測(cè)等。 數(shù)據(jù)安全:包括數(shù)據(jù)備份和恢復(fù)、數(shù)據(jù)加密、數(shù)

    2024年04月17日
    瀏覽(48)
  • 游戲后端如何實(shí)現(xiàn)服務(wù)器之間的負(fù)載均衡?

    網(wǎng)絡(luò)游戲已成為人們休閑娛樂(lè)的重要方式之一。而在游戲開(kāi)發(fā)中,如何實(shí)現(xiàn)服務(wù)器之間的負(fù)載均衡是一個(gè)非常關(guān)鍵的問(wèn)題。負(fù)載均衡不僅可以提高服務(wù)器的處理能力,還能保證游戲的穩(wěn)定性和流暢性。本文將探討游戲后端如何實(shí)現(xiàn)服務(wù)器之間的負(fù)載均衡。 一、負(fù)載均衡的概述

    2024年01月25日
    瀏覽(23)
  • 【服務(wù)器清理】Centos7 服務(wù)器磁盤(pán)爆滿,如何清理,有哪些清理方式

    【服務(wù)器清理】Centos7 服務(wù)器磁盤(pán)爆滿,如何清理,有哪些清理方式

    如果線上服務(wù)器磁盤(pán)爆滿,但是我又不敢輕易清除,這個(gè)時(shí)候可以參考以下解決方案; 提示:需要操作人員具備鏈接服務(wù)器,使用命令操作; 檢查磁盤(pán)爆滿 大文件,刪除 檢索當(dāng)前系統(tǒng),大于100M的文件,進(jìn)行查看 檢索出來(lái)之后,請(qǐng)自行根據(jù)需求進(jìn)行刪除,那些文件; 如果那

    2024年02月13日
    瀏覽(30)
  • 如何隱藏服務(wù)器真實(shí) IP,有哪些方法

    網(wǎng)站服務(wù)器的安全受到越來(lái)越多的重視,但是難免會(huì)遇到黑客使用 DDoS 攻擊網(wǎng)站,為了網(wǎng)站的安全通常都會(huì)做好防御,其中防止 DDoS 攻擊有效方法:隱藏服務(wù)器真實(shí) IP ,該技術(shù)能夠有效地保護(hù)網(wǎng)站的安全 隱藏服務(wù)器真實(shí) IP 地址的方法如下: ? ? ? ?1、CDN:CDN 可以隱藏服務(wù)

    2024年02月01日
    瀏覽(22)
  • 用Rust設(shè)計(jì)一個(gè)并發(fā)的Web服務(wù):常用Rust庫(kù)如Tokio、Hyper等,基于TCP/IP協(xié)議棧,實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的并發(fā)Web服務(wù)器,并結(jié)合具體的代碼講解如何編寫(xiě)并發(fā)Web服務(wù)器的程序

    作者:禪與計(jì)算機(jī)程序設(shè)計(jì)藝術(shù) 1994年,互聯(lián)網(wǎng)泡沫破裂,一批優(yōu)秀的程序員、工程師紛紛加入到web開(kāi)發(fā)領(lǐng)域。而其中的Rust語(yǔ)言卻備受矚目,它是一種現(xiàn)代系統(tǒng)編程語(yǔ)言,專注于安全和并發(fā)。因此,Rust在當(dāng)下成為最流行的編程語(yǔ)言之一,很多框架也開(kāi)始使用Rust重構(gòu),這使得

    2024年02月06日
    瀏覽(33)
  • 如何在linux服務(wù)器上用Nginx部署Vue項(xiàng)目,以及如何部署springboot后端項(xiàng)目

    如何在linux服務(wù)器上用Nginx部署Vue項(xiàng)目,以及如何部署springboot后端項(xiàng)目

    提示:文章寫(xiě)完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔 提示:這里可以添加本文要記錄的大概內(nèi)容: 本文內(nèi)容記錄如何在Linux(Ubuntu)系統(tǒng)上安裝Nginx,并部署打包好的Vue前端項(xiàng)目,最后通過(guò)瀏覽器訪問(wèn)。 提示:以下是本篇文章正文內(nèi)容,下面案例可供參考

    2024年04月16日
    瀏覽(31)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包