1、本質解決方案按照oracle的安裝腳本中以下幾項文件進行相應配置:
cp /etc/security/limits.conf /etc/security/limits.conf.bak
echo "oracle soft nproc 2047" >>/etc/security/limits.conf
echo "oracle hard nproc 16384" >>/etc/security/limits.conf
echo "oracle soft nofile 1024" >>/etc/security/limits.conf
echo "oracle hard nofile 65536" >>/etc/security/limits.conf
cp /etc/pam.d/login /etc/pam.d/login.bak
echo "session required /lib/security/pam_limits.so" >>/etc/pam.d/login
echo "session required pam_limits.so" >>/etc/pam.d/login
cp /etc/profile /etc/profile.bak
echo 'if [ $USER = "oracle" ]; then' >> /etc/profile
echo 'if [ $SHELL = "/bin/ksh" ]; then' >> /etc/profile
echo 'ulimit -p 16384' >> /etc/profile
echo 'ulimit -n 65536' >> /etc/profile
echo 'else' >> /etc/profile
echo 'ulimit -u 16384 -n 65536' >> /etc/profile
echo 'fi' >> /etc/profile
echo 'fi' >> /etc/profile
cp /etc/sysctl.conf /etc/sysctl.conf.bak
echo "fs.aio-max-nr = 1048576" >> /etc/sysctl.conf
echo "fs.file-max = 6815744" >> /etc/sysctl.conf
echo "kernel.shmall = 2097152" >> /etc/sysctl.conf
echo "kernel.shmmax = 4294967295" >> /etc/sysctl.conf
echo "kernel.shmmni = 4096" >> /etc/sysctl.conf
echo "kernel.sem = 250 32000 100 128" >> /etc/sysctl.conf
echo "net.ipv4.ip_local_port_range = 9000 65500" >> /etc/sysctl.conf
echo "net.core.rmem_default = 262144" >> /etc/sysctl.conf
echo "net.core.rmem_max = 4194304" >> /etc/sysctl.conf
echo "net.core.wmem_default = 262144" >> /etc/sysctl.conf
echo "net.core.wmem_max = 1048586" >> /etc/sysctl.conf
echo "net.ipv4.tcp_wmem = 262144 262144 262144" >> /etc/sysctl.conf
echo "net.ipv4.tcp_rmem = 4194304 4194304 4194304" >> /etc/sysctl.conf
sysctl -p
2、臨時解決方案:
[root@zytest04 ~]# ulimit -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) 46418
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) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 46418
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
[root@zytest04 ~]# ulimit -n 4096
[root@zytest04 ~]# ulimit -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) 46418
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 4096
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 46418
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
3、轉自網絡文檔
第一部分:(主要是命令,查看最大打開限制數量,不能解決根本問題) 在Linux下,我們使用ulimit -n 命令可以看到單個進程能夠打開的最大文件句柄數量(socket連接也算在里面)。系統默認值1024。 對於一般的應用來說(象Apache、系統進程)1024完全足夠使用。但是如何象squid、mysql、java等單進程處理大量請求的應用來說就有點捉襟見肘了。如果單個進程打開的文件句柄數量超過了系統定義的值,就會提到“too many files open”的錯誤提示。如何知道當前進程打開了多少個文件句柄呢?下面一段小腳本可以幫你查看: 00001. lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr|more 在系統訪問高峰時間以root用戶執行上面的腳本,可能出現的結果如下: 00001. # lsof -n|awk '{print $2}'|sort|uniq -c |sort -nr|more 00002. 131 24204 00003. 57 24244 00004. 57 24231 00005. 56 24264 其中第一行是打開的文件句柄數量,第二行是進程號。得到進程號后,我們可以通過ps命令得到進程的詳細內容。 00001. ps -aef|grep 24204 00002. mysql 24204 24162 99 16:15 ? 00:24:25 /usr/sbin/mysqld 哦,原來是mysql進程打開最多文件句柄數量。但是他目前只打開了131個文件句柄數量,遠遠底於系統默認值1024。 但是如果系統並發特別大,尤其是squid服務器,很有可能會超過1024。這時候就必須要調整系統參數,以適應應用變化。Linux有硬性限制和軟性限制。可以通過ulimit來設定這兩個參數。方法如下,以root用戶運行以下命令: 00001. ulimit -HSn 4096 以上命令中,H指定了硬性大小,S指定了軟性大小,n表示設定單個進程最大的打開文件句柄數量。個人覺得最好不要超過4096,畢竟打開的文件句柄數越多響應時間肯定會越慢。設定句柄數量后,系統重啟后,又會恢復默認值。如果想永久保存下來, ================================================================================= Too many open files經常在使用linux的時候出現,大多數情況是您的程序沒有正常關閉一些資源引起的,所以出現這種情況,請檢查io讀寫,socket通訊等是否正常關閉。 00001. [root@pororo script]# ulimit -a 00002. core file size (blocks, -c) 0 00003. data seg size (kbytes, -d) unlimited 00004. scheduling priority (-e) 0 00005. file size (blocks, -f) unlimited 00006. pending signals (-i) 128161 00007. max locked memory (kbytes, -l) 32 00008. max memory size (kbytes, -m) unlimited 00009. open files (-n) 800000 00010. pipe size (512 bytes, -p) 8 00011. POSIX message queues (bytes, -q) 819200 00012. real-time priority (-r) 0 00013. stack size (kbytes, -s) 10240 00014. cpu time (seconds, -t) unlimited 00015. max user processes (-u) 128161 00016. virtual memory (kbytes, -v) unlimited 00017. file locks (-x) unlimited 00018. ========================================================================== 00019. 第二部分:(解決的真正方法) 功能說明:控制shell程序的資源。 語 法:ulimit [-aHS][-c <core文件上限>][-d <數據節區大小>][-f <文件大 小>][-m <內存大小>][-n <文件數目>][-p <緩沖區大小>][-s <堆疊大 小>][-t <CPU時間>][-u <程序數目>][-v <虛擬內存大小>] 補充說明:ulimit為shell內建指令,可用來控制shell執行程序的資源。 參 數: ulimit -a 用來顯示當前的各種用戶進程限制。 |