在HBase使用的过程中,通过java程序查询HBase数据时,在某机器上hbase用户下压测时遇到这个问题,导致程序异常挂掉。在网上google了一下,发现原因是:
当前用户下无法创建更多的线程(当然root用户没这个问题)
HBase 的doc中有相关描述:http://hbase.apache.org/0.94/book/trouble.rs.html
下面是解决方案:
系统能够创建的最大线程数:(MaxProcessMemory - JVMMemory – 系统内存) / (ThreadStackSize) = Number of threads
有两种方式:
1. 减少xxx下的ThreadStackSize
2. 增加xxx下的nproc数量
修改
[hbase@node1]$ ulimit -a
core filesize (blocks, -c) 0
data segsize (kbytes, -d)unlimited
schedulingpriority (-e) 0
filesize (blocks, -f) unlimited
pendingsignals (-i) 256636
max lockedmemory (kbytes, -l) 64
max memorysize (kbytes, -m) unlimited
openfiles (-n) 65536
pipesize (512bytes, -p) 8
POSIX messagequeues (bytes, -q) 819200
real-timepriority (-r) 0
stacksize (kbytes, -s) 10240-----可以减小这个,建议在jvm –xss中减少
cputime (seconds, -t) unlimited
max userprocesses (-u) 1024-----可以增加这个到65535
virtualmemory (kbytes, -v)unlimited
filelocks (-x) unlimited
修改/etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
xxx soft nproc 65535
xxx hard nproc 65535
xxx soft stack 1024
xxx hard stack 1024
其中 xxx表示启动hbase的用户,如使用hadoop启动hbase,则配置如下:
* - nproc 102400
* - nofile 102400
hadoop hard nproc 65535
hadoop soft nproc 65535
hadoop hard stack 1024
hadoop soft stack 1024
本文参考文章http://beyond3518.blog.51cto.com/1360525/1764190,但是文章中说,改成32000就可以,在某些情况下可能不够(当前改成32000依旧出现上述问题)。所以需要适当调大(此处调大到65535就可以了。)