优化iproute2中的tc流控规则下发机制

设备基于IP对每个用户配置流量控制规则,规则如下:

tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 192.168.0.10 flowid 1:10

上面的tc 是一个配置工具,本身是一个应用程序,tc后面的参数通过应用程序参数形式传递给tc工具

业务程序通过system方式调用tc,当并发用户量比较大时,业务进程会fork出大量tc,影响系统性能

优化的思路是用一个tc守护进程代替并发的多个tc,业务程序通过socket将配置参数发送给tc手机进程

 tc守护进程是在tc进程外面套一个壳,增加一个socket 服务端,用来接收业务程序发送的tc 配置规则

 

源码:

int main(int argc, char **argv)
{
	int socket = sock_init();
    {
        char cmd[256];
        sprintf(cmd, "echo \"TC CONFIGSERVER RUNNING %d\" >> /var/log/tc.log", socket);
        system(cmd);
    }
	while (socket > 0)
	{
		socket_monitor(socket);
	}


	fprintf(stderr, "TC-SERVER EXIT !\n");

	return 0;
}

void socket_monitor(int sock)
{
	fd_set set;
	struct	timeval timeout = {0};
	int ret;
	struct tc_rule_options_t *p_req	= (struct tc_rule_options_t *)s_request_buff;

	timeout.tv_sec = 0;
	timeout.tv_usec = 10000; //10ms

	FD_ZERO(&set);
	FD_SET(sock, &set);

	ret = select(sock + 1, &set, NULL, NULL, &timeout);
	if (!((ret > 0) && FD_ISSET(sock, &set)))
	{
		return;
	}

	struct sockaddr_in client_socket_addr = {0};
	unsigned int addr_size = sizeof(client_socket_addr);
	int accept_socket = accept(sock,
									(struct sockaddr *)&client_socket_addr,
									&addr_size);
	if (-1 == accept_socket)
	{
		fprintf(stderr, "tc server socket accept Failure!!!\n");
		return;
	}

	timeout.tv_sec = 30;
    timeout.tv_usec = 0;
	setsockopt(accept_socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(struct timeval));

	unsigned int ul_rcved_len = 0;
RCV:
	ret = recv(accept_socket, s_request_buff + ul_rcved_len
			,sizeof(s_request_buff) - ul_rcved_len, MSG_NOSIGNAL);
	if (ret <= 0)
	{
		if ((-1 == ret) && (EINTR == errno))
		{
			goto RCV;
		}
	}
	else
	{
		ul_rcved_len += ret;
		if (ul_rcved_len < sizeof(struct tc_rule_options_t))
		{
			goto RCV;
		}

		//*change_point(p_req)
		//char (*aaa)[32] = (char(*)[32])p_req->argv;
		tc_main(p_req->argc, change_point(p_req));
		close(accept_socket);
	}
	accept_socket = -1;
}

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

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

相关文章

vue3+threejs新手从零开发卡牌游戏(十八):己方场上手牌添加画线

手牌上场后&#xff0c;点击己方怪兽区卡牌会跟随鼠标移动画出线条&#xff0c;之后可以通过判断鼠标移动到对方场地的某卡牌进行战斗操作&#xff0c;代码主要改动在game/index.vue文件。 1.添加鼠标移动监听事件&#xff08;移动端&#xff09;&#xff1a; window.addEven…

Scikit Learn中的概率校准曲线

概率校准是一种用于将二分类的输出分数转换为概率的技术&#xff0c;以与目标类的实际概率相关联。在本文中&#xff0c;我们将讨论概率校准曲线以及如何使用Scikit-learn绘制它们。 概率校准 概率校准曲线是二分类问题的正类的预测概率和实际观察频率之间的图。它用于检查分…

DLS-42/5-5双位置继电器 柜内安装板前接线 JOSEF约瑟

系列型号&#xff1a; DLS-41/10-2双位置继电器&#xff1b; DLS-41/9-3双位置继电器&#xff1b; DLS-41/8-4双位置继电器&#xff1b; DLS-41/6-6双位置继电器&#xff1b; DLS-42/9-1双位置继电器&#xff1b; DLS-42/8-2双位置继电器&#xff1b; DLS-42/7-3双位置继…

理解CPU与执行指令原理

本文侧重介绍cpu的工作任务&#xff0c;与cpu执行指令的过程是怎么样的&#xff1f; 目录 1.理解CPU 1.1.CPU的功能 1.2.CPU的逻辑构成 2.认识指令 2.1.什么是指令 2.2.CPU执行指令的准备工作(重点) 3.指令的执行过程 前景知识&#xff1a; 什么是计算机 就是遵循冯诺依…

微信小程序使用Vant组件库流程

目前 Vant 官方提供了 Vue 2 版本、Vue 3 版本和微信小程序版本&#xff0c;并由社区团队维护 React 版本和支付宝小程序版本。这样开发原生微信小程序的会方便很多。 官方网址&#xff1a;Vant Weapp - 轻量、可靠的小程序 UI 组件库 步骤一 通过 npm 安装 npm i vant/weap…

RXMA1 RK211 075 AC220V中间继电器 柜内安装板前接线 JOSEF约瑟

系列型号 RXMA1 RK 211 063中间继电器&#xff1b;RXMA1 RK 211 064中间继电器; RXMA1 RK 211 066中间继电器&#xff1b;RXMA1 RK 211 072中间继电器; RXMA1 RK 211 073中间继电器&#xff1b;RXMA1 RK 211 074中间继电器&#xff1b; RXMA1 RK 211 025中间继电器&#xff1b;…

k8s入门到实战(十二)—— pod的深入理解

pod 深入理解 pod 容器生命周期 pod 的几种状态 可以使用命令kubectl get pod -w实时监控查看 pod 的状态 running&#xff1a;正常运行状态Pending&#xff1a;资源分配不对的时候会挂起&#xff0c;出现此状态Terminating&#xff1a;某个节点突然关机&#xff0c;上面的 p…

uniapp微信小程序消息订阅详解

一、微信公众平台申请订阅模板 注意&#xff1a;订阅信息 这个事件 是 当用户 点击的时候触发 或者 是 支付成功后触发&#xff0c; 用户勾选 “总是保持以上选择&#xff0c;不再询问” 之后或长期订阅&#xff0c;下次订阅调用 wx.requestSubscribeMessage 不会弹窗&#xf…

浅析扩散模型与图像生成【应用篇】(十三)——PITI

13. Pretraining is All You Need for Image-to-Image Translation 该文提出一种基于预训练扩散模型的图像转换方法&#xff0c;称为PITI。其思想并不复杂&#xff0c;就是借鉴现有视觉和NLP领域中常见的预训练方法&#xff0c;考虑预先在一个大规模的任务无关数据集上对扩散模…

基于java+springboot+vue实现的校园二手交易系统(文末源码+Lw+ppt)23-336

摘 要 自从新冠疫情爆发以来&#xff0c;各个线下实体越来越难做&#xff0c;线下购物的人也越来越少&#xff0c;随之带来的是一些不必要的浪费&#xff0c;尤其是即将毕业的大学生&#xff0c;各种用品不方便携带走导致被遗弃&#xff0c;造成大量的浪费。本系统目的就是让…

浏览器如何渲染页面

浏览器渲染页面的过程是一个多步骤的复杂流程&#xff0c;下面我将通过一个简单的例子来逐步说明这一过程&#xff1a; 以下是浏览器渲染该页面的主要步骤&#xff1a; 请求HTML文档&#xff1a; 用户在浏览器中输入URL并回车&#xff0c;浏览器向服务器发送HTTP请求。 服务器…

【Java多线程】1——多线程知识回顾

1 多线程知识回顾 ⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记仓库&#x1f449;https://github.com/A-BigTree/tree-learning-notes 个人主页&#x1f449;https://www.abigtree.top ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点个star…

测试开发工程师(QA)职业到底需要干些什么?part6:数据测试工程师QA

常见任务和工作内容 作为数据测试工程师QA&#xff08;Quality Assurance&#xff09;&#xff0c;您的主要职责是确保数据的质量、准确性和一致性。以下是数据测试工程师QA的一些常见任务和工作内容&#xff1a; 数据验证和准确性测试&#xff1a;您将负责验证数据的准确性和…

数论问题代码模板

文章目录 一、质数1.1、质数筛&#xff08;筛1~n中的所有质数&#xff09;1.2、判断一个数是否为质数1.3、对一个数进行质因数分解 二、快速幂2.1、费马小定理——乘法逆元2.2、快速幂 三、约数3.1、N个数的正约数集合3.2、一个数的正约数集合 四、欧拉函数&#xff08;互质数数…

洗地机好用吗?哪款型号值得推荐?看完本文你就知道

在如今社会生活节奏不断加快的情况下&#xff0c;洗地机已经成为众多家庭的必备的清洁设备&#xff0c;面对市面上种类繁多的洗地机&#xff0c;我们常常会发出感叹“洗地机好用吗&#xff1f;洗地机哪个型好用&#xff1f;”等的疑问&#xff0c;今天&#xff0c;为了帮助大家…

一文搞定用python实现终身免费的听书工具

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

C语言程序练习——汉诺塔递归

1. 题目 在终端输入汉诺塔层数n&#xff0c;实现将n层汉诺塔通过三座塔座A、B、C进行排列 2. 代码 #include <stdio.h>int hannuota(int len, int str, int tmp, int dst) {if (1 len){printf("%c -> %c\n", str, dst);}else{hannuota(len-1, str, dst, …

好展位、抢先订!2024第二十二届上海国际涂料展|上海涂料展

致/To: 展会负责人、 市场部、 企划部、 销售部负责人 2024中国国际涂料博览会暨第二十二届中国国际涂料展览会 时间&#xff1a;2024年8月7-9日 地点&#xff1a;上海新国际博览中心 主办方&#xff1a; 中国涂料工业协会 承办方&#xff1a; 北京涂博国际展览有限公司 …

javaSwing坦克大战游戏

在游戏开发领域&#xff0c;坦克大战是一款经典的游戏&#xff0c;其简单而又耐玩的玩法吸引了无数玩家。而今&#xff0c;在Java编程技术的支持下&#xff0c;我们可以用Java Swing技术轻松实现这款经典游戏。本文将介绍如何使用Java Swing技术编写坦克大战游戏&#xff0c;并…

某对象存储元数据集群改造流水账

软件产品&#xff1a;某厂商提供的不便具名的对象存储产品&#xff0c;核心底层技术源自HDFS和Amazon S3&#xff0c;元数据集群采用了基于MongoDB的NOSQL数据库产品和MySQL数据库产品相结合。 该产品的元数据逻辑示意图如下&#xff1a; 业务集群现状&#xff1a;当前第3期建…