萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> mysql sleep 進行過多優化方法

mysql sleep 進行過多優化方法

mysql sleep 進行過多優化方法
解決辦法是:打開include/pub_db_mysql.php大概第73行,把下面的一段代碼:

  //連接數據庫
  if($pconnect == -100){ $this->linkID = @mysql_connect($this->dbHost,$this

->dbUser,$this->dbPwd); }
  else{ $this->linkID = @mysql_pconnect($this->dbHost,$this->dbUser,$this-

>dbPwd); }

替換成如下代碼:

  //連接數據庫
// if($pconnect == -100){ $this->linkID = @mysql_connect($this-

>dbHost,$this->dbUser,$this->dbPwd); }
// else{ $this->linkID = @mysql_pconnect($this->dbHost,$this->dbUser,$this-

>dbPwd); }

//直接使用connect
  $this->linkID = @mysql_connect($this->dbHost,$this->dbUser,$this->dbPwd);

保存,再看mysql的進程。是不是OK了?
官方放棄connect()而采用pconnect()的鏈接方式未必是最好的選擇。

mysql 假死狀態,sleep進程過多等等現像。導致幾十個用戶,就把系統搞定了。
其實這是 mysql 配置上的問題, 默認的 linux 中, mysql 的配置是 my-large.cnf

配置,該配置適合大型服務器。有高內存,比如2G,4G內存的,適合使用,而一般512M

內存 的就不行了。它會占用512M內存來保存系統 mysql 的進程,這些進程長期堆質,

並不釋放,導致系統緩慢。所以,把配置改變成為 my-small.cnf ,小型配置就可以了
#!/bin/sh
while :
 
do
  n=`/usr/bin/mysqladmin processlist | grep -i sleep | wc -l`
  date=`date +%Y%m%d[%H:%M:%S]`
  echo $n
 
  if [ "$n" -gt 10 ]
  then
    for i in `/usr/bin/mysqladmin processlist | grep -i sleep | awk '{print

$2}'`
    do
      /usr/bin/mysqladmin kill $i
    done
    echo "sleep is too many i killed it" >> /tmp/sleep.log
    echo "$date : $n" >> /tmp/sleep.log
  fi
sleep 5
done

方法二

kill-mysql-sleep-proc.php
  define('MAX_SLEEP_TIME',120);
  $hostname="localhost";
  $username="root";
  $password="password";
  $connect=mysql_connect($hostname,$username,$password);
  $result=mysql_query("SHOWPROCESSLIST",$connect);
  while($proc=mysql_fetch_assoc($result)){
  if($proc["Command"]=="Sleep"&&$proc["Time"]>MAX_SLEEP_TIME){
  @mysql_query("KILL".$proc["Id"],$connect);
  }
  }
  mysql_close($connect);
  ?>

  將它當中的$password改成你實際的數據庫密碼,死連接的時間也可以修改。然後

加入計劃任務就可以了。比如用crontab-e命令加入:

  */2****php/usr/local/sbin/kill-mysql-sleep-proc.php

  就可以每隔2分鐘檢查並清除一次數據庫中的死連接了。

copyright © 萬盛學電腦網 all rights reserved