# cgroup **Repository Path**: mo-shan/cgroup ## Basic Information - **Project Name**: cgroup - **Description**: cgroup在数据库环境的应用 - **Primary Language**: Shell - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-03-07 - **Last Updated**: 2025-05-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 使用须知 - 目前仅支持CPU,内存,io的资源隔离,网络还处于调研阶段 - 目前仅在MySQL环境测试通过。 - 基于cgroup v1,目前在4.14,3.10两个内核版本测试通过,其他版本请自行测试。 ### 代码结构说明 ``` # tree -L 2 . ├── cg_alertmanager.sh #告警相关脚本 ├── cg_manager.sh #客户端读cgroup规则管理的脚本 ├── cg_monitor.sh #客户端监控脚本 ├── cgroup-exporter.py #exporter ├── cg_server.sh #服务端写cgroup规则管理脚本 ├── cg_sync.sh #服务端代码同步脚本 ├── conf #配置目录 │   ├── alert.conf #告警相关的配置 │   ├── dev.conf #测试环境的配置 │   └── oltp.conf #线上环境的配置 ├── grafana #grafana dashboard │   └── grafana.json ├── LICENSE ├── lock #告警脚本部署的机器和客户端的crontab会用到这个目录 ├── log #日志 ├── README.md ├── sql #sql初始化目录 │   ├── mysql_init.sql #cgroup规则表,存在mysql │   └── tidb_init.sql #监控告警相关的表,存在mysql或者tidb都可以 ├── stop_file └── video ├── centos10-cgroup-v2.mp4 └── centos9-cgroup-v2.mp4 6 directories, 23 files # ``` ### 架构图 ![架构图](https://gitee.com/mo-shan/cgroup/raw/master/img/cgroup.jpg) #### 工作流程说明 (1)通过工单系统将cgroup配置规则写入到规则表,如下: ``` (dba:3306)@[db_huc]>select * from tb_cgroup_manager limit 1; +----+----------+---------+----------------+--------+------+--------+---------+----------+--------+-------------------------------+-----------+---------------------+---------------------+---------------------+------------+---------------+---------+ | id | order_id | igid | rshost | rsport | rule | dbtype | isotype | isovalue | istate | pidpath | mountpoin | a_time | u_time | e_time | alert_type | alert_channel | remarks | +----+----------+---------+----------------+--------+------+--------+---------+----------+--------+-------------------------------+-----------+---------------------+---------------------+---------------------+------------+---------------+---------+ | 58 | 0 | 1023763 | 192.168.10.211 | 5013 | add | mysql | cpu | 24 | 1 | /work/mysql5013/var/mysql.pid | /data0 | 2025-03-20 17:30:11 | 2025-03-20 17:30:11 | 9999-12-31 23:59:59 | | | | +----+----------+---------+----------------+--------+------+--------+---------+----------+--------+-------------------------------+-----------+---------------------+---------------------+---------------------+------------+---------------+---------+ 1 row in set (0.00 sec) (dba:3306)@[db_huc]> ``` 写入规则也可以通过`cg_server.sh`脚本手动写入,具体可以通过`cg_server.sh -h`获取帮助文档。 (2)cgroup管理端执行代码同步 ``` bash cg_sync.sh oltp|dev ``` 这个操作会将最新代码同步到目标机器,这里只会给`istate = 3`的机器同步代码,并且配置相关的cgrontab。 (3)目标机器读取规则完成配置及拉起监控 ``` */1 * * * * cd /opt/soft/cgroup && flock --wait 5 -x lock/cg_manager.lock -c "bash cg_manager.sh oltp" */1 * * * * cd /opt/soft/cgroup && flock --wait 5 -x lock/cg_monitor.lock -c "bash cg_monitor.sh oltp" ``` 目标机器会读取规则表的记录,这里只会读取`rshost = '本机ip' and istate = 3`的记录,将符合条件的记录进行配置。 (4)目标机器的监控数据会写入到`tidb`库 `cg_monitor.sh`会将资源组的状态写入到`tidb`库,另外会判断当前资源组的pid是否正常,如果异常会重新维护。 (5)`prometheus`访问`exporter`读取`tidb`的数据写入到`prometheus` (6)`grafana`访问`prometheus`进行出图 ![监控图](https://gitee.com/mo-shan/cgroup/raw/master/img/monitor.png) (7)告警脚本读取tidb库的监控表 ``` */1 * * * * cd /opt/soft/cgroup && flock --wait 5 -x lock/cg_alertmanager.lock -c "/usr/bin/timeout 300s bash cg_alertmanager.sh oltp" ``` ![告警](https://gitee.com/mo-shan/cgroup/raw/master/img/alert.png) 告警会检查三个指标: - 资源组使用是否达到告警阈值,根据`alert.conf`配置的阈值进行判断 - 资源组监控是否上报正常,根据规则表的记录对比当前已经上报的监控记录,如果两分钟内一条告警记录都没有的就告警。 - 告警脚本是否运行正常