1. 程式人生 > >Centos執行Mysql因為記憶體不足程序被殺

Centos執行Mysql因為記憶體不足程序被殺

今天剛剛申請了一個新的域名,在申請完域名剛準備繫結給小夥伴分享註冊新域名的喜悅時,剛把網站發到我們小夥伴們的討論群裡,卻發現訪問不了了,提示,資料庫連線失敗!

真的時一個尷尬.....    所有人都進不了我的網站,然後登入centos後臺,發現了這樣的提示


out of memory !  Kill   process (Mysqld)  我英語未過四級,但是這個簡單英文還是能看懂的,大致意思時記憶體不夠了,然後把mysql的程序給殺掉了,阿西吧!!!

尷尬了,怎麼辦?  小夥伴們不能讓我太尷尬啊,所以給我提了建議,說可以通過修改mysql的配置檔案my.ini實現降低mysql的執行所佔用內容。

然後找了資料,有一片就不錯的文章,在這裡就不造輪子重寫了,在此轉載過來,同時表示謝意。

文章內容如下:  供大家參考

同時線上訪問量繼續增大 對於1G 記憶體的伺服器明顯感覺到吃力 嚴重時甚至每天都會宕機 或者時不時的伺服器卡一下 這個問題曾經困擾了我  半個多月 MySQL 使用是很具伸縮性的演算法,因此你通常能用很少的記憶體執行或給MySQL更多的被存以得到更好的效能。  安裝好mysql 後,配製檔案應該在/usr/local/mysql/share/mysql 目錄中,配 制檔案有幾個,有my-huge.cnf、my-medium.cnf、my-large.cnf、my-small.cnf,不同的流量的網站和不同配製的服 
務器環境,當然需要有不同的 配製檔案了。一般的情況下,my-medium.cnf 這個配製檔案就能滿足我們的大多需要;  一般我們會把配置檔案拷貝到/etc/my.cnf 只需要修改這個配置檔案就可以了 使用mysqladmin variables extended-status –u root –p 可以看到目前的  引數 有3個配置引數是最重要的,即  key_buffer_size,query_cache_size,table_cache 1.key_buffer_size key_buffer_size 只對MyISAM 表起作用 key_buffer_size 指定索引緩衝區的大小,它決定索引處理的速度,尤其是索引 讀的速度。一般我們設為16M,實 
際上稍微大一點的站點 這個數字是遠遠不夠的,通過檢查狀態值Key_read_requests 和Key_reads,可以知道key_buffer_size 設定是否合理。比例key_reads/key_read_requests 應該儘可 能的低,至少是1:100,1:1000 更好(上述狀態值可以使用SHOW STATUS LIKE'key_read%'獲得)。 或者如果你裝了phpmyadmin可以通過伺服器執行狀態看到,筆者推薦用phpmyadmin管理mysql,以下的狀態值都是本人通過phpmyadmin 獲得的。 例項分析: 這個伺服器已經運行了20 天 key_buffer_size – 128M key_read_requests – 650759289 key_reads - 79112 比例接近1:8000 健康狀況非常好 ,另外一個估計key_buffer_size 的辦法 把你網站資料庫的每個表的索引所佔空間大小加起來看看  以此伺服器為例:比較大的幾個表索引加起來大概125M 這個數字會隨著表變大 而變大  2.query_cache_size 從4.0.1 開始,MySQL 提供了查詢緩衝機制。使用查詢緩衝,MySQL 將SELECT 語句和查詢結果存放在緩衝區中,今後對於同樣的SELECT 語句(區分大小寫),將直接從緩衝區中讀取結果。根據MySQL 使用者手冊,使用查詢緩衝最多可以達到238%的效率.通過調節以下幾個引數可以知道query_cache_size 設定得是否合理  Qcache inserts Qcache hits Qcache lowmem prunes Qcache free blocks Qcache total blocks Qcache_lowmem_prunes 的值非常大,則表明經常出現緩衝不夠的情況,同時 Qcache_hits 的值非常大,則表明查詢緩衝使用非常頻繁,此時需要增加緩衝大小  Qcache_hits 的值不大,則表明你的查詢重複率很低,這種情況下使用查詢緩衝反而會影響效率,那麼可以考慮不用查詢緩衝。此外,在SELECT 語句中加入SQL_NO_CACHE 可以明確表示不使用查詢緩衝。  Qcache_free_blocks,如果該值非常大,則表明緩衝區中碎片很多 query_cache_type 指定是否使用查詢緩衝 我設定: query_cache_size = 32M query_cache_type= 1 得到如下狀態值: Qcache queries in cache 12737 表明目前快取的條數 Qcache inserts 20649006 Qcache hits 79060095 看來重複查詢率還挺高的 Qcache lowmem prunes 617913 有這麼多次出現快取過低的情況 Qcache not cached 189896 Qcache free memory 18573912 目前剩餘快取空間 Qcache free blocks 5328 這個數字似乎有點大 碎片不少 Qcache total blocks 30953 如果記憶體允許32M 應該要往上加點 3.table_cache table_cache 指定表快取記憶體的大小。每當MySQL 訪問一個表時,如果在表緩衝 區中還有空間,該表就被開啟並放入其中,這樣可以更快地訪問表內容。通過檢查峰值時間的狀態值  Open_tables 和Opened_tables,可以決定 是否需要增加table_cache 的值。如果你發現open_tables 等於table_cache,並且opened_tables 在不斷增長,那麼你就需要增加table_cache 的值了(上述狀態值可以使用SHOW STATUS LIKE'Open%tables'獲得)。注意,不能盲目地把table_cache 設定成很大的值。如果設定得太高,可能會造成文件描述符不足,從而造成效能不 穩定或者連線失敗。對於有1G 記憶體的機器,推薦值是128-256。  筆者設定table_cache = 256 得到以下狀態: Open tables 256 Opened tables 9046 雖然open_tables 已經等於table_cache,但是相對於伺服器執行時間來說,已 經運行了20 天,opened_tables 的值也非常低。因此,增加table_cache 的值應該用處不大。如果運行了6 個小時就出現上述值 那就要考慮增大table_cache  4.log-bin 如果你不需要記錄2 進位制log 就把這個功能關掉,注意關掉以後就不能恢復出問 題前的資料了,需要您手動備份,二進位制日誌包含所有更新資料的語句,其目的是在恢復資料庫時用它來把資料 儘可能恢復到最後的狀態。另 外,如果做同步複製( Replication )的話,也需要使用二進位制日誌傳送修改情況。 log_bin 指定日誌檔案,如果不提供檔名,MySQL 將自己產生預設檔名。MySQL會在檔名後面自動新增數字引,每次啟動服務時,都會重新生成一個新的二進位制檔案。此外,使用log-bin-index 可以指定索引檔案;使用binlog-do-db 可以指定記  錄的資料庫;使用binlogignore- db 可以指定不記錄的資料庫。注意的是:binlog-do-db和binlog-ignore-db 一次只指定一個數據庫,指定多個數據庫需要多個語句。而且,MySQL會將所有的資料庫名稱改成小寫,在指定資料庫時必須全部使用小寫名字,否則不會起作用。  關掉這個功能只需要在他前面加上#號 #log-bin 5.開啟慢查詢日誌( slow query log ) 慢查詢日誌對於跟蹤有問題的查詢非常有用。它記錄所有查過long_query_time 的查詢,如果需要,還可以記錄不使用索引的記錄。下面是一個慢查詢日誌的例子:  開啟慢查詢日誌,需要設定引數log_slow_queries、long_query_times、 log-queries-not-using-indexes。 log_slow_queries 指定日誌檔案,如果不提供檔名,MySQL 將自己產生預設文 件名。long_query_times 指定慢查詢的閾值,預設是10 秒。log-queries-not-using-indexes 是4.1.0 以後引入的引數,它指示記錄不使用索引的查詢。  筆者設定long_query_time=10 6.其他一些重要引數 筆者設定: sort_buffer_size = 1M max_connections=120 wait_timeout =120 back_log=100 read_buffer_size = 1M thread_cache=32 interactive_timeout=120 thread_concurrency = 4 引數說明: back_log 要求MySQL 能有的連線數量。當主要MySQL 執行緒在一個很短時間內得到非常多的 連線請求,這就起作用,然後主執行緒花些時間(儘管很短)檢查連線並且啟動一個新執行緒。back_log 值指出在MySQL 暫時停止回答新請求之前的短時間內多少個請求可以被存在堆疊中。只有如果期望在一個短時間內有很多連接,你需要增加它,換句話說,這值對到來的TCP/IP 連線的偵聽佇列的大小。你的作業系統在這個佇列大小上有它自己的限制。 檢查你的OS 文件找出這個變數的最大值。試圖設定back_log 高於你的作業系統的限制將是無效的。  max_connections 併發連線數目最大,120 超過這個值就會自動恢復,出了問題能自動解決 thread_cache 沒找到具體說明,不過設定為32 後 20 天才建立了400 多個執行緒 而以前一天就 建立了上千個執行緒所以還是有用的  thread_concurrency #設定為你的cpu 數目x2,例如,只有一個cpu,那麼thread_concurrency=2 #有2 個cpu,那麼thread_concurrency=4 skip-innodb #去掉innodb 支援 附my.cnf 全部檔案

  1. # Example MySQL config file for medium systems.  
  2. #  
  3. # This isfor a system with little memory (32M - 64M) where MySQL plays  
  4. # an important part, or systems up to 128M where MySQL is used together  
  5. with
  6. # other programs (such as a web server)  
  7. directory is /var/lib/mysql) or
  8. # ~/.my.cnf tosetuser-specific options.  
  9. #  
  10. In this file, you can use all long options that a program supports.  
  11. # If you want to know which options a program supports, run the program  
  12. with the "--help"option.  
  13. # The following options will be passed toall MySQL clients  
  14. [client]  
  15. #password = your_password  
  16. port = 3306  
  17. socket = /tmp/mysql.sock  
  18. #socket = /var/lib/mysql/mysql.sock  
  19. # Here follows entries forsome specific programs  
  20. # The MySQL server  
  21. [mysqld]  
  22. port = 3306  
  23. socket = /tmp/mysql.sock  
  24. #socket = /var/lib/mysql/mysql.sock  
  25. skip-locking  
  26. key_buffer = 128M  
  27. max_allowed_packet = 1M  
  28. table_cache = 256  
  29. sort_buffer_size = 1M  
  30. net_buffer_length = 16K  
  31. myisam_sort_buffer_size = 1M  
  32. max_connections=120  
  33. #addnew config  
  34. wait_timeout =120  
  35. back_log=100  
  36. read_buffer_size = 1M  
  37. thread_cache=32  
  38. skip-innodb  
  39. skip-bdb  
  40. skip-name-resolve  
  41. join_buffer_size=512k  
  42. query_cache_size = 32M  
  43. interactive_timeout=120  
  44. long_query_time=10  
  45. TCP/IP port atall. This can be a security enhancement,  
  46. # if all processes that need toconnectto mysqld run on the same host.  
  47. All interaction with mysqld must be made via Unix sockets or named pipes.  
  48. # Note that using this option without enabling named pipes on Windows  
  49. # (via the "enable-named-pipe"option) will render mysqld useless!  
  50. #  
  51. #skip-networking  
  52. # Replication Master Server (default)  
  53. binary logging is required for replication  
  54. #log-bin  
  55. # required unique id between 1 and 2^32 - 1  
  56. # defaults to 1 if master-host isnotset
  57. # but will notfunction

    相關推薦

    Centos執行Mysql因為記憶體不足程序

    今天剛剛申請了一個新的域名,在申請完域名剛準備繫結給小夥伴分享註冊新域名的喜悅時,剛把網站發到我們小夥伴們的討論群裡,卻發現訪問不了了,提示,資料庫連線失敗! 真的時一個尷尬.....    所有人都進不了我的網站,然後登入centos後臺,發現了這樣的提示

    Android6.0以上應用在長時間在後臺,因為記憶體不足導致系統回收記憶體,當再次啟動應用出現Fragment重疊或者空白、異常解決方案(提供模擬記憶體不足導致系統回收記憶體的方案)。

      Android6.0以上應用在長時間在後臺,因為記憶體不足導致系統回收記憶體,當再次啟動應用出現Fragment重疊或者空白解決方案。首先提供一個方法模擬記憶體不足導致系統回收記憶體的方案:開啟Android Studio -->Tools-->Android

    Android 監聽主程序

    當按多工鍵時,然後清除所有程式或者殺死單個程式時,如果要監聽這個動作的話,可以在一個service裡監聽。 效果如下: 可以看到,在多工視窗中,左滑結束程序和清除所有程序後,都會自己再開啟應用,程式碼如下: public class KeepLifeService

    通過JNI的方式 android 防止程序

    通過JNI的方式(NDK程式設計),fork()出一個子執行緒作為守護程序,輪詢監聽服務狀態。守護程序(Daemon)是執行在後臺的一種特殊程序。它獨立於控制終端並且週期性地執行某種任務或等待處理某些發生的事件。而守護程序的會話組和當前目錄,檔案描述符都是獨立的。後臺

    android 使用Service進行雙程序守護,防止程序

    public class MyService extends Service { String msg; public MyService() { msg = "Msg from MyService"; } @Override public IBind

    【安卓篇】安卓Activity程序規則

    Android手機開發與桌面開發有一個主要不同之處:通常在一部Android手機裡同時執行著多個應用(app),每個app對應一個系統程序,當系統需要更多的資源(如記憶體)而空閒資源不足時,Android系統就會選擇殺掉一些“低優先順序”的程序以便釋放所需資源。   An

    Android防止程序

    有時開啟新的app而記憶體不夠時,其它app可能會被Out Of Memory Killer清除防止程序不被殺死的辦法: 1.在AndroidManifest.xml檔案中設定persistent屬

    mysql編譯安裝過程Killed (program cc1plus),記憶體不足

    mysql編譯安裝過程,執行make命令時報錯: c++: internal compiler error: Killed (program cc1plus) Please submit a full bug report, with preprocessed source if appro

    centos 7 使用mariadb 相容執行 MySQL

    安裝 # yum install mysql # yum install mysql-server # yum install mysql-devel 在執行#yum install mysql-server時會報錯 使用 mariadb 執行 My

    解決:CentOSMySQL執行select ... into outfile ...: Can't create/write to file '...' (Errcode: 13)

    原因:selinux阻止寫入操作 解決:vi /etc/selinux/config # This file controls the state of SELinux on the system.

    動態分配的記憶體程序結束後會作業系統回收嗎?

    首先答案是:會。 這是當時在華為培訓班的時候遇到的一個問題。很多同學本著C++沒有記憶體回收的理論認為不會被回收。而我本著作業系統設計的時候就會考慮到這一點,所以大多數現代作業系統一定會回收。這是一個

    工程執行記憶體不足的問題

    在java執行時記憶體不足,一般是java虛擬機器的空間不足,工程執行有兩個地方的記憶體需要考慮,一個事tomcat記憶體,一個事eclipse的記憶體 1. Tomcat直接啟動正常,通過myeclipse啟動tomcat記憶體溢位. MyEcl

    Java多執行緒和記憶體模型(一):程序執行緒基礎

    Java多執行緒和記憶體模型(一) 由於java是執行在 JVM上 的,所以需要涉及到 JVM 的記憶體模型概念,需要理解記憶體模型,就需要多執行緒的基礎; 而執行緒是基於載體執行緒裡的,所以我們藉由作業系統的程序來講一講。 程序 什麼是程序?

    idea 執行記憶體不足

    今天在做程式除錯時,遇到idea的記憶體不足,想把記憶體調大時,發現最大隻能到1200M,機器的記憶體有8G,導致有些程式不能完成載入。 解決辦法: 首先確認自己安裝的java的jdk是64位的,如果不是,請更新jdk到64位版本,因為64可以支援更多的執行記憶體。 其次,

    系統技術非業餘研究 » 網路棧記憶體不足引發程序掛起問題

    我們知道TCP socket有傳送緩衝區和接收緩衝區,這二個緩衝區都可以透過setsockopt設定SO_SNDBUF,SO_RCVBUF來修改,但是這些值設多大呢?這些值和協議棧的記憶體控制相關的值什麼關係呢? 我們來解釋下: $ sysctl net|grep mem net.core.wme

    【轉載】CentOS 7 安裝 mysql + mysql 常用命令 + docker 執行 mysql

    CentOS 7 安裝 mysql 檢測系統是否自帶安裝 mysql rpm -qa | grep mysql 如果你係統有安裝,那可以選擇進行解除安裝 rpm -e mysql  // 普通刪除模式 rpm -e --nodeps mysql 

    記憶體不足時Android 系統如何Kill程序

    大家其實都或多或少知道,Android系統有自已的工作管理員,當系統記憶體不足時,系統需要KILL一些程序(應用),以回收一部分資源,來保證系統仍可以正常的執行,而不會崩潰,今天,就具體講講這個原理。程序優先順序(importance hierarchy)Android系統儘

    記憶體不足mysql 導致啟動失敗

    問題:mysql 啟動報錯 [[email protected] ~]# service mysqld restart MySQL server PID file could not be found! [FAI

    Java執行過程出現的記憶體不足問題

    總結個人以及別人給的解釋,就heap和perm記憶體問題做出說明和解決辦法。 1 java.lang.OutOfMemoryError: Java heap space 解釋: Heap size 設定 JVM堆的設定是指java程式執行過程中JVM可以調配使用的記憶體空間

    Oops!核心、記憶體程序執行緒它們是抽象的

    我相信很多人“初識”計算機,是因為遇見了Windows的開機畫面,是遇見了Word、Execl、Powerpoint(當然老一輩的程式設計師排除在外,那個時候是“黑屏”或“藍屏”) 然後,很多人“入門”計算機,是因為下面的一段程式碼: #inc