Go程序出現panic
runtime: program exceeds 10000-thread limit
fatal error: thread exhaustion
...
goroutine 1120575 [runnable]:
syscall.Syscall(0x1, 0x3, 0xc4600fe000, 0x96, 0x96, 0x96, 0x0)
/usr/local/go/src/syscall/asm_linux_amd64.s:18 +0x5
syscall.write(0x3, 0xc4600fe000, 0x96, 0x400, 0x0, 0xc46018da20, 0x7)
/usr/local/go/src/syscall/zsyscall_linux_amd64.go:1064 +0x55
syscall.Write(0x3, 0xc4600fe000, 0x96, 0x400, 0x460422, 0xedb6a0, 0x1)
/usr/local/go/src/syscall/syscall_unix.go:181 +0x49
os.(*File).write(0xc4200b4560, 0xc4600fe000, 0x96, 0x400, 0xc46018dab0, 0x42974e, 0xc400000008)
/usr/local/go/src/os/file_unix.go:186 +0x6c
os.(*File).Write(0xc4200b4560, 0xc4600fe000, 0x96, 0x400, 0xb45cc6, 0xf, 0x96)
/usr/local/go/src/os/file.go:142 +0x7c
...
這個問題是因爲golang在執行syscall.Syscall
的時候,會創建新的線程,當併發大的時候不斷創建線程,導致線程數超過限制。
建議:
- 降低系統調用的併發
- 使用SetMaxThreads增加線程閥值,但是不建議這樣使用。