探索容器的底层奥秘:cinf

探索容器的底层奥秘:cinf

cinfCommand line tool to view namespaces and cgroups, useful for low-level container prodding项目地址:https://gitcode.com/gh_mirrors/ci/cinf

cinf,一个强大的命令行工具,揭示了Linux容器如Docker、rkt/appc或OCI/runc的内部结构。对于那些希望深入了解容器工作原理的开发者来说,它是一个不可或缺的神器。

项目介绍

cinf的核心在于它能够查看命名空间和控制组(cgroups),这两个是构建容器的基础。通过这个工具,你可以轻松地洞察各个进程的运行环境,监测系统资源分配,并深入到每个角落来了解容器是如何工作的。项目作者在这篇文章中阐述了其设计初衷和理念。

项目技术分析

cinf基于Go语言开发,易于安装和跨平台使用。它的主要功能包括:

  1. 显示所有命名空间:列出所有已创建的命名空间,包括其类型、进程数量以及与之关联的用户和命令。
  2. 深入命名空间:选择特定命名空间进行详细查询,查看其中的进程信息。
  3. 探索控制组:针对某个进程,查看其所属于的控制组及其属性。
  4. 监控进程:实时监控进程的控制文件,例如内存、CPU使用情况等。

应用场景

  • 故障排查:当你的容器出现问题时,cinf可以帮助你快速定位问题根源。
  • 性能优化:监测容器内进程的资源占用,从而调整资源配置。
  • 学习研究:对容器机制感兴趣的开发者可以借此深入理解容器的工作方式。

项目特点

  1. 简单易用:提供直观的命令行接口,无需复杂的配置,即可获取关键信息。
  2. 全面覆盖:不仅展示命名空间,还深入到控制组层面,涵盖了容器管理的主要方面。
  3. 实时监控:具备交互式模式,可动态观察进程控制文件的变化。
  4. 源码开放:完全开源,允许自定义和扩展,以满足特定需求。

安装与使用

安装cinf只需几行命令:

curl -s -L https://github.com/mhausenblas/cinf/releases/latest/download/cinf_linux_amd64.tar.gz -o cinf.tar.gz && \
tar xvzf cinf.tar.gz cinf && \
mv cinf /usr/local/bin && \
rm cinf*

然后就可以通过简单的命令来探索你的系统了!

cinf提供了详细的文档和示例,帮助你逐步掌握其使用方法。如果你想要更深入的了解,请访问项目页面在线文档

总的来说,cinf是一个实用的工具,无论你是运维人员还是开发者,都将从它那里获得宝贵的洞见。现在就加入,一同探索容器的深处吧!

cinfCommand line tool to view namespaces and cgroups, useful for low-level container prodding项目地址:https://gitcode.com/gh_mirrors/ci/cinf

以下是该代码的 C 语言版本: ```c #include <stdio.h> #include <stdlib.h> #include <math.h> #define MAX_BOX_NUM 1000 typedef struct { float x, y, w, h, score; int cls; } Box; float max(float a, float b) { return a > b ? a : b; } float min(float a, float b) { return a < b ? a : b; } float iou(Box a, Box b) { float inter_xmin = max(a.x - a.w / 2, b.x - b.w / 2); float inter_ymin = max(a.y - a.h / 2, b.y - b.h / 2); float inter_xmax = min(a.x + a.w / 2, b.x + b.w / 2); float inter_ymax = min(a.y + a.h / 2, b.y + b.h / 2); float inter_w = max(inter_xmax - inter_xmin, 0.f); float inter_h = max(inter_ymax - inter_ymin, 0.f); float inter_area = inter_w * inter_h; float a_area = a.w * a.h; float b_area = b.w * b.h; float union_area = a_area + b_area - inter_area; return inter_area / union_area; } void xywh2xyxy(float* box) { float x = box[0], y = box[1], w = box[2], h = box[3]; box[0] = x - w / 2; box[1] = y - h / 2; box[2] = x + w / 2; box[3] = y + h / 2; } void nms(Box* boxes, int box_num, float iou_thres, Box* out_boxes, int* out_box_num) { int* mask = (int*)malloc(sizeof(int) * box_num); int i, j, k; for (i = 0; i < box_num; ++i) { mask[i] = 1; } for (i = 0; i < box_num; ++i) { if (!mask[i]) { continue; } out_boxes[(*out_box_num)++] = boxes[i]; for (j = i + 1; j < box_num; ++j) { if (!mask[j]) { continue; } float iou_val = iou(boxes[i], boxes[j]); if (iou_val > iou_thres) { mask[j] = 0; } } } free(mask); } Box* filter_box(float* org_box, float conf_thres, float iou_thres, int* box_num) { int i, j; float* box = (float*)malloc(sizeof(float) * MAX_BOX_NUM * 6); int conf_box_num = 0; int cls[MAX_BOX_NUM]; int cls_num = 0; for (i = 0; i < MAX_BOX_NUM; ++i) { float* cur_box = org_box + i * 6; if (cur_box[4] <= conf_thres) { continue; } for (j = 0; j < 5; ++j) { box[conf_box_num * 6 + j] = cur_box[j]; } cls[conf_box_num] = (int)round(cur_box[5]); ++conf_box_num; } for (i = 0; i < conf_box_num; ++i) { int cur_cls = cls[i]; int is_new_cls = 1; for (j = 0; j < cls_num; ++j) { if (cur_cls == cls[j]) { is_new_cls = 0; break; } } if (is_new_cls) { cls[cls_num++] = cur_cls; } } Box* output = (Box*)malloc(sizeof(Box) * MAX_BOX_NUM); int output_box_num = 0; for (i = 0; i < cls_num; ++i) { int cur_cls = cls[i]; float curr_cls_box[MAX_BOX_NUM][6]; int curr_cls_box_num = 0; for (j = 0; j < conf_box_num; ++j) { if (cls[j] == cur_cls) { box[j * 6 + 5] = cur_cls; int k; for (k = 0; k < 6; ++k) { curr_cls_box[curr_cls_box_num][k] = box[j * 6 + k]; } ++curr_cls_box_num; } } for (j = 0; j < curr_cls_box_num; ++j) { xywh2xyxy(curr_cls_box[j]); } Box curr_out_box[MAX_BOX_NUM]; int curr_out_box_num = 0; nms((Box*)curr_cls_box, curr_cls_box_num, iou_thres, curr_out_box, &curr_out_box_num); for (j = 0; j < curr_out_box_num; ++j) { output[output_box_num++] = curr_out_box[j]; } } free(box); *box_num = output_box_num; return output; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孔旭澜Renata

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值