go - 如何中断系统调用
问题描述
我有一个 Go 服务从 NFS / GPFS 卷进行大量读取。我偶尔会遇到大规模问题,在此期间底层挂载无法响应特定的系统调用,从而导致整个服务被内核取消:
[98549.941930] Tainted: G O 4.14.13-1.el7.elrepo.x86_64 #1
[98549.942454] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
[98549.943422] ls D 0 14884 1 0x00000084
[98549.943968] Call Trace:
[98549.944498] __schedule+0x28d/0x880
[98549.945033] schedule+0x36/0x80
[98549.945552] schedule_preempt_disabled+0xe/0x10
[98549.946095] __mutex_lock.isra.5+0x269/0x500
[98549.946611] __mutex_lock_slowpath+0x13/0x20
[98549.947153] mutex_lock+0x2f/0x40
[98549.947695] fuse_lock_inode+0x2a/0x30 [fuse]
[98549.948248] fuse_readdir+0x113/0x7e0 [fuse]
[98549.948795] iterate_dir+0x16e/0x190
[98549.949323] ? __audit_syscall_entry+0xaf/0x100
[98549.949847] SyS_getdents+0x98/0x120
[98549.950358] ? iterate_dir+0x190/0x190
[98549.950898] do_syscall_64+0x67/0x1b0
[98549.951410] entry_SYSCALL64_slow_path+0x25/0x25
[98549.951948] RIP: 0033:0x7ffff749dcb5
[98549.952454] RSP: 002b:00007fffffffd160 EFLAGS: 00000246 ORIG_RAX: 000000000000004e
[98549.953423] RAX: ffffffffffffffda RBX: 00000000006260a0 RCX: 00007ffff749dcb5
[98549.953985] RDX: 0000000000008000 RSI: 00000000006260a0 RDI: 0000000000000005
[98549.954518] RBP: 00000000006260a0 R08: 0000000000000080 R09: 0000000000008030
[98549.955131] R10: 00007fffffffced0 R11: 0000000000000246 R12: fffffffffffffe90
[98549.955655] R13: 0000000000000000 R14: 0000000000626030 R15: 0000000000626000
我正在寻找一种添加超时的方法,这样任何失败的系统调用都不会导致整个服务中断,但在 Go 中找不到一个好的方法。
我发现的一种常见设计是从操作系统线程运行系统调用并在超时时终止该线程,但由于缺乏对底层系统线程的控制,这在 Golang 中似乎不太可能。该服务通常并行执行大量系统调用(可能数百个)。
解决方案
您可以使用 sycall 包获取进程的 pid
pid, _, _ := syscall.Syscall(syscall.SYS_GETPID, 0, 0, 0)
然后通过pid杀死进程
select {
case end = <-endSignal:
fmt.Println("The end!")
case <-time.After(5 * time.Second):
proc, _ := os.FindProcess(pid)
// Kill the process
proc.Kill()
}
推荐阅读
- r - 我试图将数据帧添加到另一个带有标题的数据帧中
- reactjs - 组件未在 React.js 中使用 router-link 呈现
- ios - 纹理 ASTextNode 边框和阴影属性不起作用
- java - 当外部测试用例使用 JUnit 5 失败时,不要启动嵌套测试用例
- asp.net - 如何使用 2 个 gridview 单元格值列来构建超链接
- angular - 检查登录用户时未定义共享服务变量
- php - 如何在招摇文件中包含其他应用程序信息?
- .htaccess - htaccess 文件中的 RewriteRule 重定向其他 URL
- .net - Solr 中的用户特定搜索
- r - 是否可以将带有数据透视表的 excel 文件读入 R?