golang program exceeds 10000-thread limit

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的時候,會創建新的線程,當併發大的時候不斷創建線程,導致線程數超過限制。

建議:

  1. 降低系統調用的併發
  2. 使用SetMaxThreads增加線程閥值,但是不建議這樣使用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章