{"id":50627235,"url":"https://github.com/seaworld008/stress-load-testing","last_synced_at":"2026-06-06T16:31:42.408Z","repository":{"id":354328381,"uuid":"1223149230","full_name":"seaworld008/stress-load-testing","owner":"seaworld008","description":"用于从一台内网机器批量分发 Linux CPU/内存压测任务的 Bash 脚本","archived":false,"fork":false,"pushed_at":"2026-04-28T04:01:59.000Z","size":16,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-28T06:09:52.049Z","etag":null,"topics":["bash","cron","linux","stress-testing","sysadmin"],"latest_commit_sha":null,"homepage":null,"language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/seaworld008.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-28T03:47:57.000Z","updated_at":"2026-04-28T04:02:02.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/seaworld008/stress-load-testing","commit_stats":null,"previous_names":["seaworld008/stress-load-testing"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/seaworld008/stress-load-testing","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seaworld008%2Fstress-load-testing","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seaworld008%2Fstress-load-testing/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seaworld008%2Fstress-load-testing/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seaworld008%2Fstress-load-testing/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/seaworld008","download_url":"https://codeload.github.com/seaworld008/stress-load-testing/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seaworld008%2Fstress-load-testing/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33990886,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-06T02:00:07.033Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bash","cron","linux","stress-testing","sysadmin"],"created_at":"2026-06-06T16:31:42.003Z","updated_at":"2026-06-06T16:31:42.403Z","avatar_url":"https://github.com/seaworld008.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Stress Load Testing\n\n一套用于内网 Linux 服务器批量部署定时压测任务的参考流程。\n\n核心使用方式：运维人员在一台内网控制机上维护 `scripts/servers.yaml`，执行一个入口脚本，\n把受管理的 `/root/scripts/load_stress.sh` 分发到目标服务器，并为每台服务器写入确定性的\nroot cron。\n\n## 文件\n\n- `scripts/servers.yaml`：真实服务器清单，本地使用，不提交到 git。\n- `scripts/servers.yaml.example`：配置模板。\n- `scripts/apply_load_stress.sh`：推荐入口，默认 dry-run，使用 `--apply` 正式部署。\n- `scripts/deploy_load_stress.sh`：部署引擎，解析 YAML、计算排班、上传脚本、替换 cron。\n- `scripts/load_stress.sh`：最终放到目标机执行的压测脚本。\n\n## 最终使用流程\n\n下面模拟一个正常运维人员从零开始使用的完整步骤。命令默认在内网控制机上执行。\n\n### 1. 进入工作目录并克隆仓库\n\n```bash\nmkdir -p /root/soft\ncd /root/soft\n\ngit clone git@github-seaworld:seaworld008/stress-load-testing.git\ncd stress-load-testing\n```\n\n如果控制机没有配置 GitHub SSH key，也可以用 HTTPS 地址：\n\n```bash\ngit clone https://github.com/seaworld008/stress-load-testing.git\ncd stress-load-testing\n```\n\n### 2. 准备控制机依赖\n\n控制机需要有 `bash`、`awk`、`ssh`、`scp`。如果 `servers.yaml` 里使用密码登录，正式部署时还需要\n`sshpass`；脚本会尝试自动安装 `sshpass`。\n\nCentOS 7 可先确认基础命令：\n\n```bash\nbash --version\nawk --version\nssh -V\nscp -V\n```\n\n### 3. 创建本地配置文件\n\n```bash\ncd /root/soft/stress-load-testing\ncp scripts/servers.yaml.example scripts/servers.yaml\nchmod 600 scripts/servers.yaml\n```\n\n`scripts/servers.yaml` 已加入 `.gitignore`，可以放内网 IP 和密码，不会提交到仓库。\n\n### 4. 修改 servers.yaml\n\n编辑配置：\n\n```bash\nvi scripts/servers.yaml\n```\n\n可以直接按下面这个结构改。注意：注释要单独写一行，不要写在配置值后面。\n\n```yaml\n# settings 是运行策略。以后改压测窗口、并发数量、压测时长和压测强度，优先改这里。\nsettings:\n  # 允许启动压测的开始时间，格式固定为 HH:MM。\n  window_start: \"02:00\"\n\n  # 允许启动压测的结束时间。脚本不会安排 04:00 或之后启动。\n  window_end: \"04:00\"\n\n  # 每隔多少分钟安排一批机器。\n  slot_minutes: 15\n\n  # 每一批最多同时启动多少台机器，避免所有机器同一时间打满。\n  max_parallel_per_slot: 2\n\n  # 单台机器每次压测持续秒数。900 秒 = 15 分钟。\n  duration_seconds: 900\n\n  # CPU 压测比例，范围 0-100，表示最多按总 CPU 核数的多少比例启动 CPU worker。\n  # 计算公式为 CPU worker = CPU 核数 * cpu_percent / 100，结果向下取整。\n  # cpu_percent: 25 表示最多约 25% CPU，例如 4 核启动 1 个 CPU worker，12 核启动 3 个。\n  # cpu_percent: 0 表示不启动 CPU 压测，只执行内存压测。\n  cpu_percent: 25\n\n  # 内存压测 worker 数。一般保持 1。\n  vm_workers: 1\n\n  # 内存压测比例。15 表示使用总内存约 15%。\n  vm_percent: 15\n\n  # 单个内存 worker 的最小内存，单位 MB。\n  vm_min_mb: 256\n\n  # 单个内存 worker 的最大内存，单位 MB，防止大内存机器压力过高。\n  vm_max_mb: 8192\n\n# defaults 是所有服务器的默认 SSH 配置。单台服务器可以覆盖这些值。\ndefaults:\n  # SSH 用户。当前脚本默认写 /root/scripts 和 root crontab，建议使用 root。\n  user: root\n\n  # SSH 端口。\n  port: 22\n\n  # SSH 密码。使用 SSH key 免密登录时填 \"\"。\n  password: \"CHANGE_ME\"\n\n  # 默认是否启用服务器。单台机器可用 enabled: false 临时跳过。\n  enabled: true\n\n# servers 是服务器清单。脚本会按这里的顺序排班。\nservers:\n  # name 只用于日志展示，建议包含主机名或业务名。\n  # host 是服务器 IP 或域名。\n  - name: pressure-node-01\n    host: 192.0.2.11\n\n  - name: pressure-node-02\n    host: 192.0.2.12\n\n  - name: pressure-node-03\n    host: 192.0.2.13\n\n  # 临时跳过某台机器时，不用删除，改成 enabled: false 即可。\n  - name: pressure-node-04\n    host: 192.0.2.14\n    enabled: false\n```\n\n### 5. 先检查 SSH 连通性\n\n任选一台目标服务器测试：\n\n```bash\nssh root@192.0.2.11 'hostname'\n```\n\n如果使用密码方式，也可以先手动测试：\n\n```bash\nsshpass -p 'CHANGE_ME' ssh root@192.0.2.11 'hostname'\n```\n\n### 6. 执行 dry-run\n\n```bash\ncd /root/soft/stress-load-testing/scripts\n./apply_load_stress.sh --dry-run\n```\n\ndry-run 只解析配置并打印排班，不连接远端服务器，不修改 crontab。\n\n输出类似：\n\n```text\n[2026-04-30 10:05:53] schedule window 02:00-04:00, slot=15m, max_parallel=2, duration=900s, cpu_percent=25, vm_percent=15\n[2026-04-30 10:05:53] deploying to pressure-node-01 (root@192.0.2.11:22) with schedule 02:00\n[2026-04-30 10:05:53] deploying to pressure-node-02 (root@192.0.2.12:22) with schedule 02:00\n[2026-04-30 10:05:53] deploying to pressure-node-03 (root@192.0.2.13:22) with schedule 02:15\n[2026-04-30 10:05:53] processed 3 enabled server(s)\n```\n\n确认这些信息：\n\n- 时间窗口是否正确，例如 `02:00-04:00`。\n- `cpu_percent`、`vm_percent` 是否符合预期。\n- 服务器 IP、端口、账号是否正确。\n- 排班是否在窗口内，没有超出结束时间。\n- 启用服务器数量是否符合预期。\n\n### 7. 正式部署\n\n确认 dry-run 正确后执行：\n\n```bash\n./apply_load_stress.sh --apply\n```\n\n脚本会对每台启用服务器执行：\n\n- 创建 `/root/scripts`。\n- 上传并覆盖 `/root/scripts/load_stress.sh`。\n- 设置脚本权限为 `700`。\n- 删除旧的受管理 cron 条目。\n- 写入新的定时压测 cron 条目。\n\n重复执行是安全的：同一台机器只会保留一条受管理的 `/root/scripts/load_stress.sh` cron。\n\n### 8. 抽查部署结果\n\n任选一两台目标服务器检查：\n\n```bash\nssh root@192.0.2.11 'crontab -l | grep load_stress'\nssh root@192.0.2.11 'ls -l /root/scripts/load_stress.sh'\n```\n\n压测执行后查看日志：\n\n```bash\nssh root@192.0.2.11 'tail -n 50 /var/log/load_stress.log'\n```\n\n如需手动试跑远端脚本：\n\n```bash\nssh root@192.0.2.11 '/root/scripts/load_stress.sh'\n```\n\n### 9. 后续调整配置\n\n以后只需要改 `scripts/servers.yaml`，再 dry-run、apply：\n\n```bash\ncd /root/soft/stress-load-testing/scripts\nvi servers.yaml\n\n./apply_load_stress.sh --dry-run\n./apply_load_stress.sh --apply\n```\n\n常见调整：\n\n- 改压测窗口：修改 `settings.window_start`、`settings.window_end`。\n- 改同批并发：修改 `settings.max_parallel_per_slot`。\n- 改 CPU 压力：修改 `settings.cpu_percent`。\n- 改内存压力：修改 `settings.vm_percent`、`settings.vm_min_mb`、`settings.vm_max_mb`。\n- 临时跳过机器：在对应服务器下增加 `enabled: false`。\n- 新增机器：在 `servers` 末尾增加一段 `name` 和 `host`。\n\n## 排班规则\n\n- 时间窗口由 `settings.window_start` 和 `settings.window_end` 控制。\n- 每个排班槽由 `settings.slot_minutes` 控制。\n- 每个排班槽最多启动数由 `settings.max_parallel_per_slot` 控制。\n- 容量 = 时间窗口分钟数 / 排班间隔 * 每槽最大并发；超过会失败退出，不会部分部署。\n\n启用服务器按 `servers.yaml` 中出现的顺序排班。比如 `02:00-04:00`、15 分钟一槽、每槽 2 台，\n就是前 2 台 `02:00`，接下来 2 台 `02:15`，以此类推；不会安排 `04:00` 或之后启动。\n\n## 目标机压测行为\n\n目标机上的 `/root/scripts/load_stress.sh` 会：\n\n- 要求 root 执行。\n- 自动安装 `stress`。\n- CPU worker 由 `settings.cpu_percent` 控制，按比例向下取整。\n- 内存 worker 和内存比例由 `settings.vm_workers`、`settings.vm_percent`、`settings.vm_min_mb`、`settings.vm_max_mb` 控制。\n- 运行时长由 `settings.duration_seconds` 控制。\n- 使用锁目录避免同一台机器上的任务重叠。\n\n## 安全约定\n\n`scripts/servers.yaml` 已被 `.gitignore` 忽略。不要把真实内网 IP、账号或密码提交到仓库。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fseaworld008%2Fstress-load-testing","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fseaworld008%2Fstress-load-testing","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fseaworld008%2Fstress-load-testing/lists"}