クラウドコンピューティングの道-柳暗花明:なぜmemcachedが渋滞するのか-ブログ園チーム-ブログ園


故障中の重要な現象が目の前に現れた--memcachedのディスクIOが高かった!
memcachedがキャッシュしたデータはすべてメモリの中にあり、メモリの占有量は高くありません.ディスクIOはどうして高いのですか.おかしい!
...
Googleで「memcached read timeout」を検索し、柳暗花明の手がかりであるmemcached timeout error because of slow responseを見つけた.
キーテキストを直接表示:
The problem seemed to boil down to the following: vm.swappiness=60 (default) is a very bad idea, when combined with deadline as a io scheduler.
...
conclusion: if you use memcache and need high amounts of memory with many objects, keep a look at your swap, and if there is something in it (even 1 kb) - it might be too much. after setting vm.swappiness to zero and paging in all swap, the effects were gone.
昨日故障したmemcachedサーバーに登って、コマンドを実行します.
cat /proc/sys/vm/swappiness 60

出力結果は60!ディスクIOの高さはメモリ交換によるものです!memcached渋滞の原因はここにある!
swappinessを0に設定すれば問題は解決しますが、設定方法の参考:Adjust Your swappiness.
 
memcachedの接続タイムアウトについて:
ユーザーにとって、最も主要な機能はデータへのアクセスであり、memcachedノードのIPアドレスまたはドメイン名がhostであり、ポートが11211であると仮定し、簡単なアクセスデータの例は以下の通りである.
MemcachedClientBuilder builder = new XMemcachedClientBuilder(
               AddrUtil.getAddresses (“localhost:11211”));
MemcachedClient memcachedClient = builder.build();
       try {
           memcachedClient. set ( "hello", 0, "Hello,xmemcached");
           String value = memcachedClient. get ( "hello");
           System. out .println( "hello="+ value);
           memcachedClient. delete ( "hello");
           value = memcachedClient.get( "hello");
           System. out .println( "hello="+ value);
       } catch (MemcachedException e) {
           System. err .println( "MemcachedClient operation fail");
           e.printStackTrace();
       } catch (TimeoutException e) {
           System. err .println( "MemcachedClient operation timeout");
           e.printStackTrace();
       } catch (InterruptedException e) {
           //ignore
       }
       try {
           memcachedClient.shutdown();
       } catch (IOException e) {
           System. err .println( "Shutdown MemcachedClient fail");
           e.printStackTrace();
       }
XmemcachedClientの作成には多くのオプションがあるため、MemcachedClientを構築するためのXmemcachedClientBuilderが用意されています.MemcachedClientは主要なインタフェースであり、memcachedを操作する主な方法はすべてこのインタフェースにあり、XmemcachedClientはその実現である.入力memcachedノードリストには、「host 1:port 1 host 2:port 2...」のような文字列が必要であり、AddrUtilを通過する.getAddressesメソッドは、実際のIPアドレスリストを取得します.格納データはsetメソッドにより、3つのパラメータがあり、1つ目は格納されたkey名、2つ目はexpire時間(単位秒)であり、この時間を超えるとmemcachedはこのデータを置き換え、0は永久格納(デフォルトは1ヶ月)を表し、3つ目のパラメータは実際に格納されたデータであり、任意のjavaシーケンス化可能なタイプであってもよい.格納されたデータを取得するにはgetメソッドでkey名を入力すればよい.格納されたデータを削除する場合は、deleteメソッドでkey名をパラメータとして受け入れます.Xmemcachedはnioベースであるため、通信プロセス自体は非同期であり、clientはmemcachedに要求を送信し、memcachedがいつこの応答を返すかを確定することはできません.クライアントはこの時点で待機するしかありません.そのため、待機タイムアウトの概念もあります.クライアントはリクエストを送信した後、応答を待機し始め、一定時間を超えると操作が失敗すると判断し、この待機時間はデフォルトで1秒であり、上記の例で示した3つのメソッド呼び出しはいずれもデフォルトのタイムアウト時間であり、この3つのメソッドには同様にタイムアウト時間の再ロードを許可する方法がある.例えば、
Value=client.get(“hello”,3000);
3秒のタイムアウトを待ち、3秒のタイムアウトでTimeutExceptionを飛び出した場合、ユーザーはこの異常を自分で処理する必要があります.待機はCountDownLatchを呼び出すことによって行われるからである.await(timeout)メソッドであるため、ユーザは割り込み異常InterruptExceptionを処理する必要がある.最後のMemcachedExceptionは、Xmemcached内部で発生した異常、例えば復号符号化エラー、ネットワーク切断などの異常を表す.
全文を読むと...