Go程序出现panic
runtime: program exceeds 10000-thread limit
fatal error: thread exhaustion
...
goroutine 1120575 [runnable]:
syscall.Syscall(0x1,0x3,0xc4600fe000,0x96,0x0)
/usr/local/go/src/syscall/asm_linux_amd64.s:18 +0x5
syscall.write(0x3,0x400,0x0,0xc46018da20,0x7)
/usr/local/go/src/syscall/zsyscall_linux_amd64.go:1064 +0x55
syscall.Write(0x3,0x460422,0xedb6a0,0x1)
/usr/local/go/src/syscall/syscall_unix.go:181 +0x49
os.(*File).write(0xc4200b4560,0xc46018dab0,0x42974e,0xc400000008)
/usr/local/go/src/os/file_unix.go:186 +0x6c
os.(*File).Write(0xc4200b4560,0xb45cc6,0xf,0x96)
/usr/local/go/src/os/file.go:142 +0x7c
...
这个问题是因为golang在执行syscall.Syscall
的时候,会创建新的线程,当并发大的时候不断创建线程,导致线程数超过限制。
建议:
- 降低系统调用的并发
- 使用SetMaxThreads增加线程阀值,但是不建议这样使用。