新建連接失敗?

来源:http://www.cnblogs.com/svan/archive/2017/08/15/7367409.html
-Advertisement-
Play Games

關於鏈接資料庫報錯: ERROR 1135 (HY000): Can't create a new thread (errno 11); if you are not out of available memory, you can consult the manual for a possible ...


 關於鏈接資料庫報錯: ERROR 1135 (HY000): Can't create a new thread (errno 11); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug

看到這個信息會有些迷惑,大概就是要麼是記憶體不夠了,要麼是遇到 OS 的bug了。但是通過free命令查看我們的記憶體是足夠的,難道真的就是OS 的bug ?不會這麼巧吧。

既然說的是記憶體不夠了, 猜測有可能是某個資源確實是越到了瓶頸,那麼執行ulimit看看呢:

[mysql@xxxx ~]$ ulimit -a
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 127405
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 204800
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) 1024 ----> 這裡似乎有點貓膩
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

到這裡可以發現max user processes 這個地方似乎有點小,而我們的DB的連接數恰好達到1024,看起來和這裡的限制有很大的關係,而這個限制一般情況下我們是通過 /etc/security/limits.conf這個文件配置的:

[mysql@xxxx ~]$ cat /etc/security/limits.conf |grep -vE '^#|^$'
soft nofile 204800
hard nofile 204800

通過cat 這個文件後發現並沒有限制這麼小呢,猜想會不會是limit.d目錄下還有另外的配置,從而發現這個目錄下還有個隱藏的配置文件90-nproc.conf,打開該文件一看果不其然是有個限制。

[mysql@xxxx ~]$ cat /etc/security/limits.d/90-nproc.conf 
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
* soft nproc 1024

通過修改這個值,然後重啟DB後,我們就可以創建更多的連接了。

到此問題已經解決了,那麼留下幾個問題:

  1. 為什麼會是90-nproc.conf 這個文件呢?
  2. 對於一個已經啟動的進程如果查看這個進程的資源限制呢?
  3. 如果動態的修改這些限制而不重啟進程?

    • 關於為什麼會是 90-nproc.conf 這個文件的值會生效? 可以查看Linux 源代碼 pam_limits.c,定位 pam_sm_open_session 這個函數。它會先讀取limits.conf 文件,然後在看limits.d 目錄下是否存在 *.conf 的配置文件,如果有這樣的配置文件,那麼依次讀取進來,覆蓋 limits.conf 的相關配置。
retval = parse_config_file(pamh, pwd->pw_name, pwd->pw_uid, pwd->pw_gid, ctrl, pl);
if (retval != PAM_SUCCESS || pl->conf_file != NULL)
/* skip reading limits.d if config file explicitely specified */
goto out;

/* Read subsequent *.conf files, if they exist. */
if (!glob_rc) {
/* Parse the *.conf files. */
for (i = 0; globbuf.gl_pathv[i] != NULL; i++) {
pl->conf_file = globbuf.gl_pathv[i];
retval = parse_config_file(pamh, pwd->pw_name, pwd->pw_uid, pwd->pw_gid, ctrl, pl);
if (retval != PAM_SUCCESS)
goto out;
}
}
  • 如何得知我們的進程啟動時候的資源限制如何? 
    可以通過 ps找到這個進程的PID ,然後 cat /proc/$PID/limits 文件得到進程資源限制
[root@Rus_naruto_192-168-3-59 ~]# cat /proc/25675/limits 
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 10485760 unlimited bytes
Max core file size unlimited unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 102400 102400 processes
Max open files 204800 204800 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 127405 127405 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
  • 有時候重啟進程是個危險的操作,而且不是所以進程都可以隨時重啟的,那當我們知道這個進程存在資源限制的瓶頸時,怎麼通過動態調整這個限制來確保我們的服務正常運行呢? 
    比如通過 /proc/$pid/limits 文件,得知我們的mysql進程存在OS級別的最大連接數限制,像調整一下這個限制可以通過一下步驟來完成:
[root@xxxx ~]# ps -ef|grep mysqld
mysql 24831 1 0 Aug07 ? 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql
mysql 25675 24831 0 Aug07 ? 00:00:34 /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql --datadir=/data/mysqldata/data --plugin-dir=/usr/local/mysql/lib/plugin --log-error=/data/mysqldata/data/xxxxxx.err --pid-file=/data/mysqldata/data/xxxxx.pid --socket=/data/mysqldata/mysql.sock --port=xxxx
[root@xxxx ~]# echo -n "Max processes=204800:204800" > /proc/25675/limits
[root@xxxx ~]# cat /proc/25675/limits
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 10485760 unlimited bytes
Max core file size unlimited unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 204800 204800 processes
Max open files 204800 204800 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 127405 127405 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us

修改了這個值後是否真的有效?如何驗證?我們可以通過把這個值該小後,然後不斷的增加連接數,當連接數達到我們的限制時,看看是否會報錯;然後在動態修改這個值,看看連接能否建立。 
mysql 連接可以簡單的寫個for迴圈,然後每個連接sleep 2秒鐘 for i inseq 150;do mysql -uxxx -pxxxx -Pxxx -h xxxx -e "select sleep(3)" & done

註: 動態的修改了/proc/$pid/limits 值之後,只是臨時生效,如果進程重啟這個限制又會重新讀取配置文件的值,一勞永逸的辦法是修改完成進程運行時的限制,然後在修改配置文件的參數。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 使用開發板為STM32F105開發板。 原本想將具體步驟給寫出來。時間有限。直接將STM32F105_USBH_HID.IOC上傳files.cnblogs.com/files/libra13179/STM32F105_USBH_HID.zip [需要註意開發板使用的外部晶振為25mhz] 下麵給出 ...
  • redhat 配置本地yum源163yum源epel 源,無需卸載yum!無須拷貝ISO都知道redhat不收費,但是其yum服務是要收費的,不想出錢那就自己配置yum源就好了。但是,看到的最多的就是讓把redhat自帶的yum全部卸掉,不檢查依賴的卸掉,然後再wget安裝。。。經過請教大神得出正確 ...
  • win server伺服器上面的tomcat老是不定時掛掉, 於是利用定時操作腳本判斷tomcat80埠是否在運行, 如果運行則放過, 如果down掉就啟動tomcat,解決tomcat不定時掛掉導致業務數據流通丟失問題.不扯淡, 上腳本. 1.給tomcat賦予環境變數 1 變數名:CATALI ...
  • 1.添加MySQL Yum存儲庫 1.1 先下載平臺發行的RPM軟體包 http://dev.mysql.com/downloads/repo/yum/,我下載的是 mysql57-community-release-el6-11.noarch.rpm 1.2 安裝你下載RPM軟體包 yum loc ...
  • 什麼是虛擬軟體: 虛擬軟體是一個可以使你在一臺機器上同時運行二個或更多Windows、LINUX等系統。它可以模擬一個標準PC環境。這個環境和真實的電腦一樣,都有晶元組、CPU、記憶體、顯卡、音效卡、網卡、軟碟機、硬碟、光碟機、串口、並口、USB控制器等常用的虛擬軟體有1.VMware workstati ...
  • 在我們操作電腦的過程中,經常會遇到電腦卡頓的情況,導致電腦卡住無法使用。只有將程式都結束才會將電腦在重新的運行起來!那麼mac電腦如何強制退出程式?正常的關閉一定是解決不了的了,只有強制的退出才能將電腦恢復過來,下麵就和小編一起來看看具體如何操作吧! mac電腦強制退出程式步驟: 第一種方法:調出“ ...
  • 1.下載CentOS 準備工具:U盤兩個(U啟動和CentOS引導),電腦一臺 登錄CentOS官網:https://www.centos.org/download/,點擊“Everything ISO”進入下載頁面。 此處我們選擇一個iso文件,這裡選擇的是阿裡雲的鏡像“http://mirror ...
  • 本文目錄: 7.1 DNS必懂基礎 7.1.1 域的分類 7.1.2 主機名、功能變數名稱、FQDN 7.1.3 域的分層授權 7.1.4 DNS解析流程 7.1.5 /etc/resolv.conf 7.2 DNS術語 7.2.1 遞歸查詢和迭代查詢 7.2.2 權威伺服器和(非)權威應答 7.2.3 D ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...