您正在碰到操作系統本身的max open files per process
限制。
看一看ulimit -S -a
:(這裏顯示例如礦)
xenon-lornix:~> ulimit -S -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 29567
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 29567
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
去翻列表,看到它說open files
?默認限制爲1024,這意味着用戶(您在這種情況下!)最多隻能同時打開每個進程的1024個文件。
一個典型的程序默認打開3個文件,STDIN,STDOUT,& STDERR ...留下1021個文件描述符可用...所以當你打開1022nd數據庫時,它拒絕並失敗。
一定要閱讀涉及ulimit
的手冊頁,令人驚訝的是,它不是
man ulimit
!最好的文檔是bash
,所以請嘗試man bash
,然後按斜槓('/
')並鍵入ulimit
來搜索它。 (在我的bash手冊頁的3383行左右)
各種ulimits的更詳細的編程方面可以在man getrlimit
中找到。
請記住ulimit與硬件和軟件限制。用戶可以將限制(通過-S
)從0更改爲限制值爲HARD(-H
)。但是用戶不能RAISE他們HARD限制,如果用戶降落時他們HARD限制,他們無法再次上揚回來。只有超級用戶(root)可能會提高限制。
因此,要提高你的SOFTopen files
限制,試試這個:
ulimit -S -n 8192
一個怪癖...的ulimit 默認來設置HARD限制。我有一個別名的ulimit默認保存到軟限制,這樣的:
alias ulimit='ulimit -S'
如果你碰巧添加-H
選項,它會覆蓋默認軟(-S
)選項,所以一切都很好。
要查看硬限制:
ulimit -H -a
爲我工作。你能分享一些關於你的環境的額外信息,比如你正在運行的sqlite版本和操作系統。 – laalto