{"id":50779441,"url":"https://github.com/nasty-project/nasty-top","last_synced_at":"2026-06-12T02:03:26.751Z","repository":{"id":352043288,"uuid":"1213590827","full_name":"nasty-project/nasty-top","owner":"nasty-project","description":"A top-like TUI for bcachefs filesystems","archived":false,"fork":false,"pushed_at":"2026-05-24T19:19:03.000Z","size":1402,"stargazers_count":10,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-05-24T21:18:23.770Z","etag":null,"topics":["bcachefs","filesystem","sysfs","top","tuning"],"latest_commit_sha":null,"homepage":"","language":"Rust","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/nasty-project.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-17T14:43:39.000Z","updated_at":"2026-05-24T19:19:07.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/nasty-project/nasty-top","commit_stats":null,"previous_names":["nasty-project/nasty-top"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/nasty-project/nasty-top","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nasty-project%2Fnasty-top","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nasty-project%2Fnasty-top/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nasty-project%2Fnasty-top/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nasty-project%2Fnasty-top/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nasty-project","download_url":"https://codeload.github.com/nasty-project/nasty-top/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nasty-project%2Fnasty-top/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34225356,"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-12T02:00:06.859Z","response_time":109,"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":["bcachefs","filesystem","sysfs","top","tuning"],"created_at":"2026-06-12T02:03:26.141Z","updated_at":"2026-06-12T02:03:26.743Z","avatar_url":"https://github.com/nasty-project.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# nasty-top\n\nA top-like TUI for bcachefs filesystems. Real-time per-device IO, latency, and internal stats with built-in tuning advisor.\n\nBuilt for [NASty](https://github.com/nasty-project/nasty) but works on any system with a mounted bcachefs filesystem.\n\n![nasty-top device IO](screen1.jpg)\n![nasty-top process IO](screen2.jpg)\n![nasty-top counters](screen3.jpg)\n\n## Features\n\n- **Live IO throughput and latency** per device with user/btree/journal/sb breakdown\n- **Latency from bcachefs time_stats** (EWMA rolling mean, not useless cumulative averages)\n- **Per-device IO breakdown** using `io_done` JSON and `io_latency_stats_*_json`\n- **Blocked stats view** showing what's actually blocking IO right now (allocator, journal, write buffer, etc.)\n- **Stall detection** with 60-second event log when latency exceeds 200ms\n- **Tuning hints** that flag known bcachefs pressure signals and show an example sysfs command (informational only — not applied automatically)\n- **Options panel** with inline editing of runtime-tunable sysfs options\n- **Multi-filesystem support** — press `f` to cycle between mounted bcachefs filesystems\n- **Process IO view** showing which processes are doing IO\n- **Journal fill %**, load average, reconcile progress\n- **Session-aware error counts**: the device Err column dims pre-existing counts and turns bold red only when errors grow during the current run — so you can tell at a glance whether a number is dead history or actively climbing\n- **Consistent color scheme**: yellow = read, blue = write, red = errors/stalls\n\n## Install\n\n**Nix:**\n```bash\nnix run github:nasty-project/nasty-top\n```\n\n**Homebrew (Linux):**\n```bash\nbrew install fenio/tap/nasty-top\n```\n\n**Download binary:**\n```bash\ncurl -sL https://github.com/nasty-project/nasty-top/releases/latest/download/nasty-top-x86_64-linux.tar.gz | \\\n  sudo tar xzf - -C /usr/local/bin/\n```\n\n**Build from source:**\n```bash\ncargo install --path .\n# or cross-compile from macOS:\nbrew install filosottile/musl-cross/musl-cross\nrustup target add x86_64-unknown-linux-musl\n./deploy.sh root@your-nas\n```\n\n## Usage\n\n```\nnasty-top [OPTIONS]\n\nOptions:\n  -f, --filesystem \u003cNAME|UUID\u003e  Filesystem to monitor (default: first found)\n  -t, --interval \u003cSECONDS\u003e      Refresh interval (default: 2)\n  -h, --help                    Print help\n```\n\n## Keybindings\n\n| Key | Action |\n|-----|--------|\n| `?` | Toggle help popup |\n| `o` | Toggle options panel (hidden by default) |\n| `c` | Toggle counters view |\n| `t` | Toggle blocked stats / time_stats view |\n| `p` | Toggle process IO view |\n| `r` | Toggle reconcile on/off |\n| `g` | Toggle copygc on/off |\n| `f` | Cycle between filesystems |\n| `Tab` | Switch focus between metrics and options panel |\n| `↑`/`k`, `↓`/`j` | Navigate options / scroll counter, blocked, process views |\n| `Enter` | Edit selected option value (in options panel) |\n| `Esc` | Cancel edit / dismiss status message |\n| `N` | Mute current hint for 2 minutes |\n| `!` | Never show this hint again |\n| `C` | Clear all permanent mutes |\n| `q` / `Ctrl-C` | Quit |\n\n## Data Sources\n\n| Metric | Source | Notes |\n|--------|--------|-------|\n| IO throughput | `dev-N/io_done` (JSON) | Per-type breakdown, diffed per tick |\n| IO latency (device) | `dev-N/io_latency_stats_{r,w}_json` | EWMA mean, shown only when active |\n| IO latency (fs) | `time_stats/data_{read,write}` | \"recent\" column rolling mean |\n| Blocked stats | `time_stats/blocked_*` | Count delta per tick + recent mean |\n| Journal fill | `internal/journal_debug` | dirty/total entries + watermark |\n| Reconcile | `bcachefs reconcile status` | Subprocess, parsed for progress |\n| Process IO | `/proc/\u003cpid\u003e/io` | read_bytes/write_bytes diffed |\n| Options | `options/*` | Read/write directly to sysfs |\n\n## Tuning Hints\n\nWhen known bcachefs pressure signals fire (journal fill, blocked allocator, etc.), a hint appears in the footer with a short reason and an example sysfs command you *could* run. Nothing is applied automatically — the hint is informational. The current heuristics are unverified; treat them as a starting point for investigation, not a prescription. See [TUNING_RULES.md](TUNING_RULES.md) for the full rule set.\n\n## License\n\nGPL-3.0-only\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnasty-project%2Fnasty-top","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnasty-project%2Fnasty-top","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnasty-project%2Fnasty-top/lists"}