2026-09-24 14:42:54
irtt 专门测长期延迟稳定性和抖动,按固定间隔发包(如每 10ms 一个),统计 RTT、单向延迟、IPDV(抖动)和丢包。它比 ping 精确得多,很适合跑几小时甚至几天的稳定性测试。
相比于传统的 ICMP (Ping) 测试,IRTT 采用 UDP 能够更真实地模拟 VoIP、在线游戏等实时业务的流量,并能同时测量出双向丢包、单向延迟 (OWD) 以及抖动 (IPDV) 等深度指标。
“`
irtt server
irtt client -i 10ms -d 1h -l 64
“`
在 alpine 下安装:
“`
echo “@edgecommunity http://mirrors.ustc.edu.cn/alpine/edge/community” >> /etc/apk/repositories
apk update
apk add irtt@edgecommunity
“`
其他系统按需安装。
也可以这样纯静态交叉编译后放到目标机器中使用:
“`
$ git clone https://github.com/heistp/irtt.git
$ cd irtt
$ CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags=”-s -w -extldflags ‘-static'” -o irtt_linux_arm64 ./cmd/irtt
“`
效果:
“`
seq=1213 rtt=270µs rd=1.9s sd=-1.9s ipdv=71.5µs
seq=1214 rtt=254µs rd=1.9s sd=-1.9s ipdv=15.3µs
seq=1215 rtt=283µs rd=1.9s sd=-1.9s ipdv=28.3µs
interrupt
Min Mean Median Max Stddev
— —- —— — ——
RTT 171µs 280µs 273µs 3.74ms 111µs
send delay -1.9s -1.9s -1.9s -1.9s 105µs
receive delay 1.9s 1.9s 1.9s 1.9s 18.9µs
IPDV (jitter) 180ns 49.2µs 33µs 3.52ms 147µs
send IPDV 63ns 41.1µs 26.4µs 3.45ms 143µs
receive IPDV 30ns 18.2µs 13.8µs 158µs 17.7µs
send call time 10.5µs 20.5µs 127µs 9.05µs
timer error 76ns 258µs 925µs 159µs
server proc. time 2.95µs 6.57µs 53.8µs 2.55µs
duration: 12.2s (wait 0s)
packets sent/received: 1217/1216 (0.08% loss)
server packets received: 1216/1217 (0.08%/0.00% loss up/down)
bytes sent/received: 77888/77824
send/receive rate: 51.2 Kbps / 51.2 Kbps
timer stats: 2/1219 (0.16%) missed, 2.58% error
“`
2026-09-24 10:34:14
下面以向运行中的 LXC 容器注入 `/dev/vhost-net` 为例讲解。
有两种思路:**临时注入**(容器重启后失效)和**永久配置**(写入配置)。有时无法重启 lxc 容器,希望配置生效,就可以用临时注入热载入,在写入配置,这样现在就可以用,下次重启后载入配置就不用热载入了。下面介绍方法:
## 临时注入
(容器运行中,立即生效)
**步骤 1:在宿主机上确认设备号**
“`bash
ls -l /dev/vhost-net
# crw-rw-rw- 1 root kvm 10, 238 … /dev/vhost-net
“`
主设备号通常是 `10`,次设备号常见为 `238`(以你机器输出为准)。
如果没有该设备,先加载模块:
“`bash
modprobe vhost_net
“`
**步骤 2:在容器的 devices cgroup 中放行该设备**
cgroup v1:
“`bash
lxc-cgroup -n devices.allow “c 10:238 rwm”
“`
cgroup v2(现代发行版默认)没有 `devices.allow` 文件,设备控制基于 eBPF,`lxc-cgroup` 一般无法这样动态修改。此时建议改用下面的”永久配置 + 重启”。
**步骤 3:在容器内创建设备节点**
“`bash
lxc-attach -n — mknod -m 666 /dev/vhost-net c 10 238
“`
> 或直接去容器里执行后面的命令即可。
> 注意:如果是非特权容器,容器内 `mknod` 通常会被拒绝(用户命名空间中没有 `CAP_MKNOD`),此时需要用 bind mount 方式或永久配置。
**替代:直接 bind mount 设备文件(不需要 mknod)**
“`bash
# 找到容器的 rootfs 路径后,在宿主机上创建目标文件并 bind mount
touch /var/lib/lxc//rootfs/dev/vhost-net
mount –bind /dev/vhost-net /var/lib/lxc//rootfs/dev/vhost-net
“`
(还需要 cgroup 放行,否则容器里访问会得到 `Operation not permitted`。)
## 永久配置
编辑 `/var/lib/lxc//config`(或 `~/.local/share/lxc/…`):
“`ini
# cgroup v1
lxc.cgroup.devices.allow = c 10:238 rwm
# cgroup v2
lxc.cgroup2.devices.allow = c 10:238 rwm
# 自动挂载设备节点
lxc.mount.entry = /dev/vhost-net dev/vhost-net none bind,create=file 0 0
“`
然后重启容器。
2026-09-23 14:36:56
在宝塔面板安装 PostgreSQL 时遇到 `pgsql_install.sh: 83: Syntax error: Bad fd number` 错误,排查发现是我使用的系统 (Debian13) 默认的 `/bin/sh` 链接到了 **dash**(常见于 Ubuntu/Debian 系统),而安装脚本中使用了部分 dash 不支持的语法或重定向符号。
错误日志类似下面这样:
“`
pgsql_install.sh: 83: Syntax error: Bad fd number
“`
检索了一下,官方论坛在很早就出现了这个问题,但至今没有很好的解决,因此将解决方案在这里记录一下。
## 解决方法
可以通过将系统的默认 `/bin/sh` 临时或永久更改指向 `bash` 来解决该问题。
步骤 1:检查当前的 sh 指向
在终端执行以下命令:
“`bash
ls -l /bin/sh
“`
如果输出显示指向 `dash`(例如 `/bin/sh -> dash`),说明确实是这个原因。
步骤 2:将 sh 更改为 bash
执行下面命令将 `/bin/sh` 重新定向到 `/bin/bash`:
“`bash
sudo mv /bin/sh /bin/sh.bk
sudo ln -s /bin/bash /bin/sh
“`
步骤 3:重新在宝塔面板中安装
更改完成后,回到宝塔面板,重新卸载并再次尝试安装 PostgreSQL 插件及数据库。
2026-09-17 23:22:49
最近在使用 DeepSeek Harness 时,对接 DeepSeek 官方模型,奈何消耗过高,一会儿就几块钱出去了,于是打算对接 opencode go 订阅,但是发现对接时 dsh 一方面没有 dsv4.1 模型,一方面是对接直接报错。
考虑到这个问题应该会很快被解决,但是由于需要立刻用上,就简单整理一下解决方案,出现同样的问题的朋友可以参考一下。
## 背景
DSH 不维护模型清单,`opencode-go` 的模型来自上游 `@earendil-works/pi-ai` 的静态目录。该目录滞后于 OpenCode 实际提供的模型,需要在 `~/.dsh/settings.yaml` 手工补充。
但是直接加也不行,会有几个约束:
## 约束
1. **不能往内置 `opencode-go` 路由里直接加模型。** 单个 model 条目只接受 `name`/`contextWindow`/`maxTokens`/`input`/`reasoningEfforts`/`compat`,`api` 和 `baseURL` 是路由级字段。而 `opencode-go` 是混合协议路由(27 个模型分属 3 种 wire protocol),新模型无处继承 `api`,直接加会报:
“`
model “xxx” needs an api; the installed catalog does not describe it
“`
在路由级写 `api` 又会把全部 27 个模型强制成同一协议。**解法是新开一条单协议路由。**
2. **OpenCode Go 自 2026-09-05 起要求 `x-opencode-session` 请求头**,pi-ai 不发送该头,否则报 `400 MissingSessionID`。见 [discussions#5495](https://github.com/deepseek-ai/deepseek-harness/discussions/5495)。
## 配置方法
编辑 `~/.dsh/settings.yaml`:
> 注,这里面的随机串记得替换
“`yaml
llm-pi-ai:
providers:
opencode-go:
apiKeyEnv: OPENCODE_GO_API_KEY
opencode-go-v41:
displayName: OpenCode Go (V4.1)
apiKeyEnv: OPENCODE_GO_API_KEY
api: openai-completions
baseURL: https://opencode.ai/zen/go/v1
headers:
x-opencode-session: dsh-local-
models:
– id: deepseek-v4.1-flash
name: DeepSeek V4.1 Flash
contextWindow: 1000000
maxTokens: 384000
input: [ text, image ]
reasoningEfforts: { low: low, high: high, max: max }
compat:
supportsStore: false
supportsDeveloperRole: false
maxTokensField: max_tokens
requiresReasoningContentOnAssistantMessages: true
thinkingFormat: deepseek
agent-default-model:
provider: opencode-go-v41
model: deepseek-v4.1-flash
reasoningEffort: high
“`
注意:
– 路由必须放在 `providers` 字典下,键名即路由名,不要写错层级了。
– 两条路由共用同一个 `apiKeyEnv`,无需重复配置凭据。
– 改动下次请求生效,不必重启。
设定后在GUI 模型选择器中会出现 `OpenCode Go (V4.1)` 分组。
最后就可以正常调用了:

## 关于 x-opencode-session 的说明
上面用的是**静态值**,所有会话共用一个 id。能解除 400,但服务端会认为所有对话是同一段,**prompt 缓存会失效**(该模型缓存读取 $0.003 vs 输入 $0.15,长对话差异明显)。
更好的替代:社区插件 [`dsh-opencode-session`](https://www.npmjs.com/package/dsh-opencode-session) 复用 DSH 会话 id,每会话唯一且跨轮次稳定。
“`bash
dsh plugin –profile web add dsh-opencode-session
“`
装后删掉配置里的 `headers` 段。需完全重启 dsh。该插件会 patch 全局 `fetch`,安装前建议先审查源码。
官方修复进展见 discussions#5495;届时两种 workaround 都可退役。
2026-05-29 15:20:00
在 Linux + Wayland 环境下使用 Joplin 时,如果配合 fcitx5 输入中文,可能会遇到输入漏字的问题。
下面这份配置可作为参考:
“`diff
➜ Downloads cat /usr/share/applications/joplin-desktop.desktop
[Desktop Entry]
Name=Joplin
Comment=Joplin for Desktop
-Exec=/usr/bin/joplin-desktop –gtk-version=3 –ozone-platform=x11
+Exec=/usr/bin/joplin-desktop –gtk-version=3 –ozone-platform-hint=auto –enable-wayland-ime
Terminal=false
Icon=joplin-desktop
StartupWMClass=@joplin/app-desktop
Type=Application
Categories=Office;
MimeType=x-scheme-handler/joplin;
SingleMainWindow=true
“`
使用 `–ozone-platform=x11` 可以解决 Joplin 全局菜单不显示的问题,但中文输入时可能会出现漏字。
改用 `–ozone-platform-hint=auto –enable-wayland-ime` 后,可以解决 fcitx5 中文输入漏字的问题;不过相应地,Joplin 全局菜单可能又无法正常显示。
实测二者不可两全,暂无找到很好的方法。建议先采用第一行配置,显示出来菜单做好配置后,改用第二行配置,确保后期中文输入体现。
输入漏字真的很恼火,如有两全解决方案欢迎讨论。
## Refs
– [Joplin can not use fcitx ime when I use wayland](https://github.com/laurent22/joplin/issues/10345)
2026-05-12 05:56:06
在 KDE 桌面下默认使用全局菜单显示应用程序的菜单栏,但是唯独 Joplin 无法显示。
最后在这里找到了解决方案,下面简单记录:
“`
sudo vim /usr/share/applications/joplin-desktop.desktop
“`
“`diff
–Exec=/usr/bin/joplin-desktop
++Exec=/usr/bin/joplin-desktop –gtk-version=3 –ozone-platform=x11
“`
启动程序增加这两个参数即可解决。
## Refs
– ArchLinux Wiki: Electron
– Menu bar lost on Manjaro Linux #14126
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=21yjpwt8mhhc0