LINUX 入门 9

LINUX 入门 9

day11 20240507 耗时:120min

课程链接地址

第9章 百万并发的服务器

1 百万并发项目介绍与并发概念讲解

书接上回,把server做成并发量百万级的服务量

装4台虚拟机 vmware右下角可以设置虚拟机内存 内核

没敲,就看了一下,我的天,老师也没让敲multi_port.c的代码,直接用

gcc -o tcp_server tcp_server.c
./tcp_server 8888 开起来server

gcc -o multi mult.c
 ./multi 192.168.243.128 8888

2 connection refused问题解决

服务器爆了

fd file descriptor 文件描述符 文件系统默认每个进程的fd只有1024

  1. 彻底修改
sudo vim /etc/security/limits.conf
最后加
*	hard	nofile 1048576
*	soft	nofile 1048576 是2^20次

改完以后sudo reboot重启

  1. 用命令临时修改, 系统重启以后没了
uilmit -a 所有-a 可以看到openfiles -n (1024)
sudo ulimit -n 1048576 改大

3 request address问题分析与解决

connect: cannot assign requested address

是client还是server 的address用不了

**问题:**socketfd(文件描述符fd) 与网络地址ip什么关系

换言之

  1. send怎么从sockfd里发到buffer到对端

    sockfd–>可以找到五元组(远程ip, 远程port,本机ip, 本机port, proto协议)

  2. recv怎么从buffer取到cliendfd里

    正好反,从五元组反过来读出socketfd

是五元组被用完了

server:192.168.243.128:8888

client:对于client来说,五元组:远程ip, 远程port,本机ip, proto协议是tcp都确定,但是本机port被耗尽了

解法

  1. 把client的远程port多开几个,现在只开了8888

4 request address解决方案的实现

端口只有65535个, 为什么socketfd可以到百万

希望可以多个端口 远程port

改tcp_server.c里开8888 -8987 100个

int islistenfd(int fd, int *fds) {

	int i = 0;
	for (i = 0;i < MAX_PORT;i ++) {
		if (fd == *(fds+i)) return fd;
	}

	return 0;
}


main里
	
	int port = atoi(argv[1]); // start 
	int sockfds[MAX_PORT] = {0}; // listen fd
	int epfd = epoll_create(1);  

	int i = 0;
	for (i = 0;i < MAX_PORT;i ++) {

		int sockfd = socket(AF_INET, SOCK_STREAM, 0);

		struct sockaddr_in addr;
		memset(&addr, 0, sizeof(struct sockaddr_in));
		addr.sin_family = AF_INET;
		addr.sin_port = htons(port+i); // 8888 8889 8890 8891 .... 8987
		addr.sin_addr.s_addr = INADDR_ANY; 

		if (bind(sockfd, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)) < 0) {
			perror("bind");
			return 2;
		}

		if (listen(sockfd, 5) < 0) {
			perror("listen");
			return 3;
		}
		printf("tcp server listen on port : %d\n", port + i);

		struct epoll_event ev;
		ev.events = EPOLLIN; 
		ev.data.fd = sockfd;
		epoll_ctl(epfd, EPOLL_CTL_ADD, sockfd, &ev);

		sockfds[i] = sockfd;
	}
	// 

先listen监听100个port,然后放到epoll里管理所有IO

client和server都编译后
server端
./tcp_server 8888 速度变快了

client端
 ./multi 192.168.243.128 8888

htop可以看内存和cpu使用 装一下

5 nf_conntrack_max的分析

client 64999 server 65535

文件描述符fd个数与最大个数fs.file_max = 1048576是两个

  1. 文件系统没问题,防火墙 nf(net filler) 的问题??

nf_conntrack_max

cat /proc/sys/net/netfiller/nf_conntrack_max
是655536

vim /etc/sysctl.conf
fs.-max =1048576
net.nf_conntrack_max= 1048576

设置以后生效 看数能到65536吗
sudo sysctl -p

可能一个下午 问题等待时间长

并发连接没那么难,

  1. server报错: too many open files in system

    filemax不够大

    sudo syctl -p
    
    cat /pro/sys/fs/file-max
    
    vim /etc/sysctl.conf
    fs.-max =1048576
    net.nf_conntrack_max= 1048576
    
  2. 报错:sysctl:cnannot stat /pro/sys/net/nf_conntrack_max:no such file or directory

    sudo modprobe ip_conntrack
    

    sudo sysctl -p是一个Linux命令,用于加载并应用sysctl.conf文件中的内核参数配置。当修改了sysctl.conf文件后,需要使用该命令来使更改生效。

6 tcp wmem与rmem的调参与实现

clientfd可以到80万左右,4G内存跑满

问题:内存回收

断开时2核CPU瞬间全红,大量client瞬间down了,尽量避免,难以存client的状态

引入tcp协议栈

sudo vim /etc/sysctl.conf

net.ipv4.tcmp_mem = 252144 524288 786432  单位是page, 一页是4k 对应1G2G3G
net.ipv4.tcmp_wmem = 1024 1024 2048  发送socket的send buffer 最小1k,中间默认1k 最大2k
net.ipv4.tcmp_rmem = 1024 1024 2048  接受buffer

生效
sudo vim /etc/sysctl.conf

就能做到100万

用xshell

问题:为什么是100万,不是10万

因为企业里就是这个级别,单台千万级技术不同!!!

完结撒花 🌸, 两周左右扫一遍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/600898.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

alpine安装中文字体

背景 最近在alpine容器中需要用到中文字体处理视频&#xff0c;不想从本地拷贝字体文件&#xff0c; 所以找到了一个中文的字体包font-droid-nonlatin&#xff0c;在此记录下。 安装 apk add font-droid-nonlatin安装好后会出现在目录下/usr/share/fonts/droid-nonlatin/ 这…

Mac 链接 HP 136w 打印机步骤

打开 WI-FI 【1】打开打印机左下角Wi-Fi网络设计【或者点击…按钮进入WI-FI菜单】&#xff0c;找到NetWork选项OK进入&#xff1b; 【2】设置WI-FI选项&#xff1a;在菜单内找到Wi-Fi选项OK进入&#xff1b; 【3】在菜单内找到Wi-Fi Direct选项OK进入&#xff1b; 【4】在菜单…

java+jsp+Oracle+Tomcat 记账管理系统论文(完整版)

⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️ ➡️点击免费下载全套资料:源码、数据库、部署教程、论文、答辩ppt一条龙服务 ➡️有部署问题可私信联系 ⬆️⬆️⬆️​​​​​​​⬆️…

SpringBoot中这样用ObjectMapper

每次new一个单例化个性化配置小结 你要说他有问题吧&#xff0c;确实能正常执行&#xff1b;可你要说没问题吧&#xff0c;在追求性能的同学眼里&#xff0c;这属实算是十恶不赦的代码了。 首先&#xff0c;让我们用JMH对这段代码做一个基准测试&#xff0c;让大家对其性能有个…

9. Django Admin后台系统

9. Admin后台系统 Admin后台系统也称为网站后台管理系统, 主要对网站的信息进行管理, 如文字, 图片, 影音和其他日常使用的文件的发布, 更新, 删除等操作, 也包括功能信息的统计和管理, 如用户信息, 订单信息和访客信息等. 简单来说, 它是对网站数据库和文件进行快速操作和管…

项目经理【人】任务

系列文章目录 【引论一】项目管理的意义 【引论二】项目管理的逻辑 【环境】概述 【环境】原则 【环境】任务 【环境】绩效 【人】概述 【人】原则 【人】任务 一、定义团队的基本规则&塔克曼阶梯理论 1.1 定义团队的基本规则 1.2 塔克曼阶梯理论 二、项目经理管理风格 …

如何更好地使用Kafka? - 事先预防篇

要确保Kafka在使用过程中的稳定性&#xff0c;需要从kafka在业务中的使用周期进行依次保障。主要可以分为&#xff1a;事先预防&#xff08;通过规范的使用、开发&#xff0c;预防问题产生&#xff09;、运行时监控&#xff08;保障集群稳定&#xff0c;出问题能及时发现&#…

UDP广播

1、UDP广播 1.1、广播的概念 广播&#xff1a;由一台主机向该主机所在子网内的所有主机发送数据的方式 例如 &#xff1a;192.168.3.103主机发送广播信息&#xff0c;则192.168.3.1~192.168.3.254所有主机都可以接收到数据 广播只能用UDP或原始IP实现&#xff0c;不能用TCP…

【Git】Git学习-09:.gitignore忽略文件

学习视频链接&#xff1a;【GeekHour】一小时Git教程_哔哩哔哩_bilibili 在gitignore中写入规则 在目录中创建一个名为 .gitignore 的文件 输入 vi .gitignore进入编辑模式&#xff0c;输入规则后保存并退出 文件里可以写文件名&#xff0c;可以写 *.后缀 Linux创建文件夹&…

背包问题(一维数组,二维数组,)分割等和字串

背包问题 0-1背包&#xff08;i代表的是0到i任取&#xff0c;有不放i状态和放i状态 dp[i][j]表示&#xff0c;背包容量为j&#xff0c;可从i种物品中任选。 价值总和最大是多少&#xff01;&#xff01; 确定递推公式 再回顾一下dp[i][j]的含义&#xff1a;从下标为[0-i]的物…

Apple OpenELM设备端语言模型

Apple 发布的 OpenELM&#xff08;一系列专为高效设备上处理而设计的开源语言模型&#xff09;引发了相当大的争论。一方面&#xff0c;苹果在开源协作和设备端AI处理方面迈出了一步&#xff0c;强调隐私和效率。另一方面&#xff0c;与微软 Phi-3 Mini 等竞争对手相比&#xf…

VS2022快捷键修改

VS2022快捷键修改 VS2022快捷键修改 VS2022快捷键修改

200554-19-4,AF350琥珀酰亚胺酯具有较高的荧光量子产率

产品概述 AF350 NHS Ester&#xff0c;即AF350琥珀酰亚胺酯&#xff0c;是一种重要的荧光标记染料&#xff0c;具有广泛的应用领域和显著的性能特点。 中文名称&#xff1a;AF350琥珀酰亚胺酯 英文名称&#xff1a;AF350 NHS Ester&#xff0c;AlexaFluor350 SE CAS号&…

DI-engine强化学习入门(十又二分之一)如何使用RNN——数据处理、隐藏状态、Burn-in

一、数据处理 用于训练 RNN 的 mini-batch 数据不同于通常的数据。 这些数据通常应按时间序列排列。 对于 DI-engine, 这个处理是在 collector 阶段完成的。 用户需要在配置文件中指定 learn_unroll_len 以确保序列数据的长度与算法匹配。 对于大多数情况&#xff0c; learn_un…

UDP多播

1 、多播的概念 多播&#xff0c;也被称为组播&#xff0c;是一种网络通信模式&#xff0c;其中数据的传输和接收仅在同一组内进行。多播具有以下特点&#xff1a; 多播地址标识一组接口&#xff1a;多播使用特定的多播地址&#xff0c;该地址标识一组接收数据的接口。发送到多…

【知识点随笔分享 | 第十篇】快速介绍一致性Hash算法

前言&#xff1a; 在分布式系统中&#xff0c;数据的分布和负载均衡是至关重要的问题。一致性哈希算法是一种解决这些挑战的有效工具&#xff0c;它在分布式存储、负载均衡和缓存系统等领域得到了广泛应用。 随着互联网规模的不断扩大&#xff0c;传统的哈希算法在面对大规模…

大历史下的 tcp:一个松弛的传输协议

如果 tcp 是一个相对松弛的协议&#xff0c;会发生什么。 所谓松弛感&#xff0c;意思是它允许 “漏洞”&#xff0c;允许可靠传输的不封闭&#xff0c;大致就是&#xff1a;“不求 100% 可靠&#xff0c;只要 90%(或多或少) 可靠&#xff0c;另外 10% 的错误可检测到” or “…

STM32:配置EXTI—对射式红外传感器计次

文章目录 1、中断1.2 中断系统1.3 中断执行流程 2、STM32中断2.2EXTI&#xff08;外部中断&#xff09;2.3 EXTI 的基本结构2.4 AFIO复用IO口 3、NVIC基本结构3.2 NVIC优先级分组 4、配置EXTI4.2 AFIO 库函数4.3 EXTI 库函数4.4 NVIC 库函数4.5 配置EXTI的步骤4.6 初始化EXTI 1…

渗透测试流程

一、攻击流程 信息收集阶段→漏洞分析阶段→攻击阶段→后渗透阶段 二、信息收集 1、收集内容&#xff1a; IP资源&#xff1a;真实IP获取、旁站信息收集、C段主机信息收集域名发现&#xff1a;子域名信息收集、子域名枚举发现子域名、搜索引擎发现子域名、第三方聚合服务器发…

PyQt 入门

Qt hello - 专注于Qt的技术分享平台 Python体系下GUI框架也多了去了&#xff0c;PyQt算是比较受欢迎的一个。如果对Qt框架熟悉&#xff0c;那掌握这套框架是很简单的。 一&#xff0c;安装 1.PyQt5 pip3 install PyQt5 2.Designer UI工具 pip3 install PyQt5-tools 3.UI…
最新文章