• 締切済み

F5対策 sql発行ページにて

turbolinux server10 php4 mysql5.0.18 にて コミュニティーサイトを構築しています sqlを発行しているページをリロード(F5長押し)すると CPU使用率が跳ね上がります 質問内容は 「sql発行ページにてF5リロードにも絶える方法は?」です よろしくお願いします cpu使用率というのはTOPコマンドで表示させながら F5長押しすると、cpu(s)の左端「us」部分の数値が100%になります user部分には「apache」が並びます 出来るだけ単純にして テストもしました test.phpを用意 このphpは 1.DB接続 2.あるtblのカウントを取得(15,000件) 3.取得結果を表示 4.DB切断 このtest.phpをリロードしても結果は同じです 今の設定では リロードすると 1.apacheは表示させようとする 2.mysqlがsql発行 3.まだsql結果が返ってこないのに、apacheは表示させようとする   ・   ・   ・ と待ち行列が発生していると思っています さて、このF5リロードしても大丈夫なWEBシステムに修正するには 1.SQLが重いから待っているだけ!これで問題なし   ⇒sqlを見直して軽くすることに勤めろ! 2.○○の設定で回避できるよ! 3.マシン性能が云々・・・ のどれでしょうか? 私は2番の答えを希望しています 理由:1は限界です・・・多少のチューニングは可能ですが    もう無理かも    3は予算がありません・・・ただ、マシン性能という問題では    ない気がします(P4-3.0 M-1G 線は光です) 以上、説明の足りない部分があると思いますが よろしくお願いします

みんなの回答

noname#45409
noname#45409
回答No.2

私が個人的に運用するサイトと比較してみました。 トップページで最も重いクエリが0.07秒程度だったので、クエリ1つが0.01秒ならばそんなに遅くないかな・・・と思ったのですが、2回目に実行したら0.0001 秒・・・ということで、連打されてもノープロブレムなようです。0.01秒というのが、何度も実行した後での事ですと、私のサイトと比べると遅いようです。 というわけで、my.cnf周りでも解決できそうです。 私のサイトですと、アプリケーション特性を考慮し、下記のパラメータをチューニングしています。 delayed_queue_size=***M max_connection=*** key_buffer=***M table_cache=*** sort_buffer_size=***M join_buffer_size=***M read_buffer_size=***M read_rnd_buffer_size=***M myisam_sort_buffer_size=***M query_cache_size=***M tmp_table_size=***M thread_cache=*** 値については***で潰させて頂きました。 これを全部設定するのはやり過ぎかもしれないので・・・、table_cacheやkey_bufferあたりを中心にやってみるといいです。参考URLはオフィシャルのマニュアル(日本語)です。 ところで、まさか第二段ですが、トランザクション等を使わないテーブル(マスタ等)はMyISAMですよね・・・?

参考URL:
http://dev.mysql.com/doc/refman/4.1/ja/server-parameters.html
jojo12345
質問者

お礼

返事か遅れて申し訳ございません my.cnfより key_buffer=64M (元16M) table_cache=256 (元64) sort_buffer_size=4M (元512k) read_buffer_size=1M (元128k) に設定しました 初期値より値を上げた変更となります ただ、目に見えて改善はされません ううん・・・さてどうしようかな・・・ 現象をもう一度 index.phpをクライアントから表示して F5を10秒押し続ける ⇒サーバー側でTOPを見ていると  cpuは80%以上となりtasksは70から200となります  下方の表にはuser [mysql] command[mysqld]が10  user [apache] command[httpd]が5程並びます  1分ほどすれば、cpuやtaskesは元に落ち着きます・・・ やはり、こんなシステムおかしいですよね・・・  

jojo12345
質問者

補足

全てmyisamです とにかくスピードを出したかったので・・・ my.cnfについて勉強及び設定がんばってみます 結果は後日報告させていただきます

noname#45409
noname#45409
回答No.1

一般論ですと、どれくらい派手にF5を押したのかはしりませんが、それなりのビジターが居れば、それなりにF5を押したのと同じ状況になります。 アプリケーションのチューニングを業務で請け負う事も多々ありますが、ソースコード改修&DB再設計で直せる、つまりアプリケーションで直す幅が一番大きいのが一般的ですので、それできっちり対応すべきだと思います。あとはdbの設定関連(my.cnf)なんかも結構効果あります。 今回特有としては・・・失礼ながら、かなりショボイ、ストレステストであっさりやられているあたり、まさかdb接続でpconnect()を使っていなかったりってありますかね・・・? ページビューがある程度以上多い場合、pconnect()でないと死にます・・・。 そうでないとすると、my.cnf周りでだいぶいけそうですが。

jojo12345
質問者

お礼

テスト結果の報告が遅くなり、申し訳ございません で、結果ですが 目に見えて改善されるような事はありませんでした ただ、マニュアルを見ると、pconnect()を使うのが正解だと思いますので修正しました sqlを10個発行しているページ(index)という設計が ダメなのでしょうかね・・・ だだ、10個でも1つ1つは0.01秒で帰ってくるのですが・・・ うーん、どうしようかな・・・

jojo12345
質問者

補足

ご回答、ありがとうございます >ページビューがある程度以上多い場合、pconnect()でないと死にます・・・。 ・・・mysql_connect()を使用していましたTT mysql_pconnectに変更してテストしてみます (うう・・・全然しらなかったTT) ありがとうございました!!

関連するQ&A

  • SQLを時間ごとに発行したい

    ■やりたいこと ・テキストに書いてあるSQLを発行したい ・何分かごとにSQLを自動発行したい ■できていること ・CSVに結果を吐き出すようにSQLは組んでテキストに記述済み ・SQLのテストは完了 ・時間ごとはタスクスケジューラを使うのかな?と考えている 上記のような感じです。 スクリプトは考え付いてません。 SQLを発行するに当たってなのですが・・・・ まだどういったDBを使うかを検討している段階なのでいかんとしがたい部分もありますがローカルから何らかの接続をして発行するのかとも思います。 SQL以外はどうしたらよいかも検討がついておりませんのでどなたかよろしくお願いします。

  • 初質問!xamppでMY SQLを動かすようにするには??

    こんばんわ。 はじめまして。 データベースは初めてなのですが、PHPも少しなれてきたためSQLも始めてみようと思い書き込ませていただきました。 アパッチ、PHP、mySQLはxamppという一括インストールソフトで運用しています。 ふだんは自分のパソコンでアパッチ、PHPを動かしOKならレンタルサーバーにアップするといった具合です。 今はDB的なことはPHPでまかなっていますが今後のためにもSQLの使い方が知りたいのです。 xamppの中にMysqlが入ってはいますが、 使ったことがありません。 いろいろなサイトを見ましたがお手上げです。。。 初歩的な質問で申し訳ないのですが、 ごくごく簡単な使用法を教えてください。 宜しくお願いします。

    • ベストアンサー
    • MySQL
  • インクルードによる不具合

    PHP初心者です。 以下2つのファイルを使って簡単な接続テストを行ってから徐々に 目的のものを作り上げていこうとしたのですが、どうにもうまく動作しません。(2つは同一ディレクトリにある) ・「mysql.php」:DB接続とSQLの発行 ・「test.php」:ブラウザ出力(本体:mysql.php呼び出し元) 実行すると「*** DB/SQLテスト ***」のみブラウザに出力されるため、試しに「mysql.php」で行うDB接続とSQL発行をすべてtest.phpに直接書いてインクルードせず単体で実行したところ、目的の結果が表示されました。 なので問題はインクルード文にあるのだと思うのですが検討がつきません。 どなたかお力をお貸し下さい。 ちなみに以下のコードは参考にしたテキストの例題をもとに見やすくするため余分な処理やエラー処理などを省いたものです。 ■mysql.php <?php class MySQL{ var $m_con; var $m_rows = 0; function MySQL(){ $this->m_con = mysql_connect("ホスト名", "ユーザ名", "パスワード"); mysql_select_db("データベース名", $this->m_con); } function query($sql){ $this->m_rows = mysql_query($sql, $this->m_con); return $this->m_rows; } } ?> ■test.php <html> <head> <meta http-equive="Content-type" content="text/html; charset=utf-8"> <title>SQLtest</title> </head> <body> *** DB/SQLテスト ***<br> <?php include("mysql.php"); $mysql = new MySQL; $sql = "SELECT * FROM staff"; $mysql->query($sql); while($row = mysql_fetch_array($this->m_rows)){ echo $row["id"]; echo $row["name"]; echo "<br>"; } ?> </body> </html>

    • ベストアンサー
    • PHP
  • データベースの中にあるソースコードを実行させたい

    こんにちは。php初心者です。 データベースの中にphpコードを保存して、それをphpで呼び出して中のソースを実行させたいのですがphpコードがそのまま表示されてしまいます。何か良い方法はありますでしょうか? ●データベースの中身 [ID] 0 [contents] $test="テスト"; ●ソース <?php $db = mysql_connect('localhost','root'); mysql_select_db('hoge',$db); $id = mysql_escape_string(0); $sql = "select * from contents where ID = '$id';"; $contents = mysql_query($sql,$db); mb_http_output ( 'UTF-8' ); $aryCol=mysql_fetch_assoc($contents); $a = $aryCol['contents']; echo $a; echo $test; ?> ●実行結果 $test="テスト"; ●開発環境 Apache2.0.59 PHP4.3.2 MySQL4.0.26 と、いうような感じです。実行結果は「テスト」という文字のみ表示させたいのですが、$aに入っているソースコードがそのまま表示されてしまい、$testには何も入っていないままです。 このような処理は不可能なのでしょうか?またデータベースに入っているソースコードの処理を行いたい場合、どのような処理をすればよろしいでしょうか? 私では経験不足なため皆様のお知恵を拝借できればと思い質問させていただきました。くだらない質問で大変恐縮ですがご回答のほうよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • F5で直前の動作が・・・

    PHPのSmartyを用いてWebサイトを作成しています。 F5を押下すると直前に行っていた動作をもう一度行われてしまい、 直前の機能によってはバグが発生します。 (たとえば「./test」内のファイルを検索した結果を表示した後に、 F5を押下すると「./test/test」を探しにいってしまい、そんなディレクトリはない!とwarningが出ます) F5を押下した場合はリロードされDB情報の更新を確認しにいくだけで、 直前の動作を行わせないようにしたいのですが 良い方法はありますでしょうか?

    • ベストアンサー
    • PHP
  • phpでのsql文で変数を使う

    POSTで受け取った文字列を,テーブル名として新規テーブルを作成したいのですが,sql文発行の際の変数の記述方法がわかりません。 ネットや本に書いてある方法は一通りためしたのですが,失敗しましたとなります。 ご教授下さい。 php 5.2.3 apache2.2.4 mysql 5.0.45 <?php require_once("../dbini.php"); $con = mysql_connect($DBSERVER, $DBUSER, $DBPASS); $selectdb = mysql_select_db($DBNAME, $con); $name = $_POST['name']; $sql = "create table $name ( qno int(3), qcontents text(500))"; $rst = mysql_query($sql,$con); if($rst){ echo $name . "を作成しました。"; }else{ echo "データベースの作成に失敗しました。"; } ?>

    • ベストアンサー
    • PHP
  • mysql_fetch_array()関数でのエラー

    現在、PHPでMySQLの操作をテストしています。 Vista上にXAMPPをインストールした環境とXP上にApache,PHPとMySQLを個別にインストールした環境とで検証しています。 どちらの環境でも、テーブルにデータをインサートするところまでは出来ました。 mysql_fetch_array()関数を使ってSQLの実行結果を表示させるところで、XAMPPでは結果を表示できるのですが、個別インストール環境では Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in D:\****\incert.php on line 8 が出てしまいます。 mysql_error()でエラーを表示させたところ No database selected と表示されます。 mysql_select_db("db_name"); でDBはせんたくされていると思う(事実、XAMPPでは選択されている)のですが、何が問題なのでしょうか?

  • SQLのどこがおかしいでしょうか?

    PHP4、MySQLです。 for($i=1;$i<34;$i++){ $sql = "select count(group) as cnt".$i." "; $sql.= "from stock "; $sql.= "where group=".$i." "; //print "sql= ".$sql."<br>"; $result = mysql_query($sql,$db) or die("失敗しました".mysql_error ()); $Row = mysql_fetch_array($result, MYSQL_ASSOC); $cnt.$i = $Row['cnt".$i."']; } としています。どこがおかしいでしょうか? 教えてください。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • SQLserver2008でのSQL発行時ののオブジェクトエラーについ

    SQLserver2008でのSQL発行時ののオブジェクトエラーについて 「sa」ユーザーでDB作成後テーブルも複数作成。そのあとにこのSQLを「SELECT * FROM (テーブル名)」で発行すると、赤線が出てきてオブジェクト(テーブル名)が無効です。」とのエラーメッセージが出てきます。けれども結果は正しく表示されます。 何がいけないのでしょうか? 「DB名」.「dbo」.「テーブル名」でも同じです・・・ スキーマ関係があまり詳しくないので是非教えてください。

  • PHPからMySQLに接続はできるが、Sql操作ができない

    PHPからMySQLを使おうとしているのですが、 SQLクエリでの操作に対する反応がなく、困っています。 mysql_select_db()でtrueが返ってきているので、 DBにはアクセス出来ているようなのですが、 mysql_query()を実行しても何も返らず、エラーも出ません。 SQLに間違いはなく、あってもエラーがでるはずだったと思うのですが… 何かお分かりのことが御座いましたら、ご協力お願いいたします。

    • ベストアンサー
    • MySQL