Quantcast
Channel: プログラム の個人的なメモ
Viewing all 860 articles
Browse latest View live

【Linux】【コマンド】 top コマンド

$
0
0

■ top

 * サーバの稼働状況である「CPU」「メモリ使用率」「プロセスの稼働状況」などを、
   一定時間間隔でリアルタイムに表示

■ 構文

top 【オプション】

主なオプション

`オプション`備考
`#
`説明
1 -d 間隔「ss.tt」を指定[秒] -d:delay 2 -n 表示を繰り返す回数を指定 -n:number 3 -b バッチモード。キー操作を受け付けない。 -b:batch 4 -i 何も実行していないアイドルプロセスを非表示


■ ソート順

`キー
`#
説明
1Shift + pCPU使用率でソート
2Shift + mメモリ使用量でソート
3Shift + t実行時間でソート

■ 実行例

top -i

top -d 2 -n 10 -b > top.log

■ 出力結果例

top - 10:55:45 up 4 min,  2 users,  load average: 0.02, 0.14, 0.09
Tasks: 168 total,   1 running, 166 sleeping,   1 stopped,   0 zombie
%Cpu(s):  3.9 us,  0.3 sy,  0.0 ni, 95.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   4056560 total,   626128 used,  3430432 free,    35844 buffers
KiB Swap:  1324028 total,        0 used,  1324028 free,   292164 cached

  PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND
 2863 root      20   0  179m  28m 5764 S   5.3  0.7   0:02.56 Xorg
 4444 root      20   0  396m  21m  13m S   3.3  0.5   0:01.20 gnome-terminal
  158 root      20   0     0    0    0 S   0.3  0.0   0:00.44 kworker/0:2

出力項目

6行目
`項目
`#
説明
01PIDプロセスID
02USERユーザID
03PR静的優先度(数字が低い程優先度は高い)
04NI対的優先度(-20(最高)~19(最低))
05VIRT仮想メモリサイズ(スワップアウトされたメモリ使用量を加えたサイズ)
06RES物理メモリサイズ
07SHR共有メモリサイズ
08Sステータス(状態。S:スリープ, R:実行中, Z:ゾンビ)
09%CPUCPU使用率
10%MEMメモリ使用率
11TIME+プロセス実行時間
12COMMAND実行されているコマンド
※ スワップアウト(swap out)
 * 主記憶装置上にメモリの空き領域が少ない場合に、
   優先順位の低いジョブを補助記憶装置に移す


関連記事

【Linux】パフォーマンスに関わるコマンド ~ Linux編 ~

https://blogs.yahoo.co.jp/dk521123/34615658.html

【AWS】Lambda ~ Java / EC2 を取得する ~

$
0
0

■ はじめに

https://blogs.yahoo.co.jp/dk521123/37276995.html
の続き。

今度は、EC2の情報を取得してみる。

■ サンプル

[[http://docs.aws.amazon.com/ja_jp/sdk-for-java/v1/developer-guide/examples-ec2-instances.html#describing-instances]]
より抜粋
インスタンスの説明

インスタンスをリスト表示するには、DescribeInstancesRequest を作成し、
AmazonEC2Client の describeInstances メソッドを呼び出します。
お客様のアカウントとリージョンの Amazon EC2 インスタンスをリスト表示するのに
使用できる DescribeInstancesResult オブジェクトが返されます。

LambdaEc2ListDemo.java

import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.AmazonEC2ClientBuilder;
import com.amazonaws.services.ec2.model.DescribeInstancesRequest;
import com.amazonaws.services.ec2.model.DescribeInstancesResult;
import com.amazonaws.services.ec2.model.Instance;
import com.amazonaws.services.ec2.model.Reservation;
import com.amazonaws.services.ec2.model.Tag;
import com.amazonaws.services.lambda.runtime.Context;

public class LambdaEc2ListDemo {
  public Object handleRequest(Object input, Context context) {
    final AmazonEC2 ec2 = AmazonEC2ClientBuilder.defaultClient();
    DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest();
    DescribeInstancesResult describeInstancesResult = ec2.describeInstances(describeInstancesRequest);
    for (Reservation reservation : describeInstancesResult.getReservations()) {
      for (Instance instance : reservation.getInstances()) {
        System.out.println("Instance ID : " + instance.getInstanceId());
        System.out.println("Public IP Address : " + instance.getPublicIpAddress());
        System.out.println("Key Name : " + instance.getKeyName());
        for (Tag tag : instance.getTags()) {
          System.out.println("Key : " + tag.getKey());
          System.out.println("Value : " + tag.getValue());
        }
      }
    }
    return "Done!";
  }
}

関連記事

【AWS】Lambda ~ Java / EC2 を操作する ~

https://blogs.yahoo.co.jp/dk521123/37276995.html

【Java】Tomcat JDBC Connection PoolでJavaプログラムからMySQLに接続する

$
0
0

■ はじめに

 * DBのパフォーマンスチューニングのため、
   Tomcat JDBC Connection Poolの使用を検討しているので
   まずは、Javaプログラム単体で動きを確かめる。
http://symfoware.blog68.fc2.com/blog-entry-1364.html
が参考になる。感謝。

■ 準備

 * 以下のjarファイルをインポートする

  [1] /lib/tomcat-jdbc.jar
  [2] /bin/tomcat-juli.jar
  [3] mysql-connector-java-X.X.XX-bin.jar (今回は「mysql-connector-java-5.1.40-bin.jar」)

補足:[2] tomcat-juli.jar について

『[2] tomcat-juli.jar』をインポートしないと、コンパイルは通るが、以下の例外が発生する

 Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory
	at org.apache.tomcat.jdbc.pool.PoolProperties.<clinit>(PoolProperties.java:36)
	at com.sample.TomcatJdbcConnectionPoolDemo.main(TomcatJdbcConnectionPoolDemo.java:12)
Caused by: java.lang.ClassNotFoundException: org.apache.juli.logging.LogFactory
	at java.net.URLClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	... 2 more

■ サンプル

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.tomcat.jdbc.pool.DataSource;
import org.apache.tomcat.jdbc.pool.PoolProperties;

public class TomcatJdbcConnectionPoolDemo {
  public static void main(String[] args) {
    PoolProperties dbPool = new PoolProperties();
    dbPool.setUrl("jdbc:mysql://localhost:3306/sampledb?useSSL=false");
    dbPool.setDriverClassName("org.gjt.mm.mysql.Driver");
    dbPool.setUsername("root");
    dbPool.setPassword("password");
    dbPool.setJmxEnabled(true);
    dbPool.setTestWhileIdle(false);
    dbPool.setTestOnBorrow(true);
    dbPool.setValidationQuery("SELECT 1");
    dbPool.setTestOnReturn(false);
    dbPool.setValidationInterval(30000);
    dbPool.setTimeBetweenEvictionRunsMillis(30000);
    dbPool.setMaxActive(100);
    dbPool.setInitialSize(10);
    dbPool.setMaxWait(10000);
    dbPool.setRemoveAbandonedTimeout(60);
    dbPool.setMinEvictableIdleTimeMillis(30000);
    dbPool.setMinIdle(10);
    dbPool.setLogAbandoned(true);
    dbPool.setRemoveAbandoned(true);
    dbPool.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"
        + "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");

    DataSource datasource = new DataSource();
    datasource.setPoolProperties(dbPool);
    try (Connection connection = datasource.getConnection();
        Statement statement = connection.createStatement();
        ResultSet resultSet = statement.executeQuery("select * from person");) {
      while (resultSet.next()) {
        System.out.println("Id:" + resultSet.getString("id") + " Name:" + resultSet.getString("name"));
      }
    } catch (SQLException ex) {
      ex.printStackTrace();
    }
  }
}

補足:「useSSL=false」について

 * 以下のログが出るため。
警告ログ
Thu Dec 28 23:54:28 JST 2017 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

■ パフォーマンス検証

http://symfoware.blog68.fc2.com/blog-entry-1364.html
のように検証。対象はMySQL。

【1】Poolなし版の検証プログラム

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class NormalDemo {
  public static void main(String[] args) {
    String url = "jdbc:mysql://localhost:3306/sampledb?useSSL=false";
    String user = "root";
    String password = "password";

    long start = System.currentTimeMillis();
    for (int i = 0; i < 101; i++) {
      long lap = System.currentTimeMillis();
      try (Connection connection = DriverManager.getConnection(url, user, password);) {
      } catch (SQLException ex) {
        ex.printStackTrace();
      }
      System.out.println("[" + i + "]" + (System.currentTimeMillis() - lap));
    }

    long end = System.currentTimeMillis();
    System.out.println("[Done]" + (end - start));
  }
}

【2】Poolあり版の検証プログラム

import java.sql.Connection;
import java.sql.SQLException;
import org.apache.tomcat.jdbc.pool.DataSource;
import org.apache.tomcat.jdbc.pool.PoolProperties;

public class TomcatJdbcConnectionPoolDemo {
  public static void main(String[] args) {
    PoolProperties dbPool = new PoolProperties();
    dbPool.setUrl("jdbc:mysql://localhost:3306/sampledb?useSSL=false");
    dbPool.setDriverClassName("org.gjt.mm.mysql.Driver");
    dbPool.setUsername("root");
    dbPool.setPassword("password");
    dbPool.setJmxEnabled(true);
    dbPool.setTestWhileIdle(false);
    dbPool.setTestOnBorrow(true);
    dbPool.setValidationQuery("SELECT 1");
    dbPool.setTestOnReturn(false);
    dbPool.setValidationInterval(30000);
    dbPool.setTimeBetweenEvictionRunsMillis(30000);
    dbPool.setMaxActive(100);
    dbPool.setInitialSize(10);
    dbPool.setMaxWait(10000);
    dbPool.setRemoveAbandonedTimeout(60);
    dbPool.setMinEvictableIdleTimeMillis(30000);
    dbPool.setMinIdle(10);
    dbPool.setLogAbandoned(true);
    dbPool.setRemoveAbandoned(true);
    dbPool.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"
        + "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");

    DataSource datasource = new DataSource();
    datasource.setPoolProperties(dbPool);
    long start = System.currentTimeMillis();
    for (int i = 0; i < 101; i++) {
      long lap = System.currentTimeMillis();
      try (Connection connection = datasource.getConnection();) {
      } catch (SQLException ex) {
        ex.printStackTrace();
      }
      System.out.println("[" + i + "]" + (System.currentTimeMillis() - lap));
    }

    long end = System.currentTimeMillis();
    System.out.println("[Done]" + (end - start));
  }
}

検証結果

 * パフォーマンスは確かにあがる
【1】Poolなし版の検証プログラム
1回目:769ms(うち初回接続:395ms)
2回目:744ms(うち初回接続:379ms)
3回目:750ms(うち初回接続:390ms)
【2】Poolあり版の検証プログラム
1回目:397ms(うち初回接続:374ms)
2回目:415ms(うち初回接続:392ms)
3回目:396ms(うち初回接続:373ms)

【JMX】 JConsole

$
0
0

■ 用語整理

 * まず、用語の整理から。

JMX

Java Management Extensions(JMX)
 * Java アプリケーションをモニタおよび管理するための仕様
`構成要素
`#
説明
1MBean管理対象オブジェクトに対応する管理用オブジェクト
2MBeanServerMBeanのコンテナ
3Connector/Protocol Adapter外部との通信を行うコンポーネント。ConnectorはJMXの独自プロトコル,Protocol AdapterはHTTPなどの既存プロトコルを使用する

JConsole

 * JDK に付属され、 JMXに準拠したモニタリング・無料ツール

■ JConsoleを使用してみる

設定環境

 * OS : Windows10
 * Java : JDK1.8.0_111

手順

[0] Javaのプログラム(特になければ、以下の「サンプルプログラム」)を事前に動かしておく
[1] 【JDK】/bin/jconsole.exe をダブルクリックし、JConsole を起動する
[2] 「ローカル・プロセス」を選択し、
     対象のプログラム (今回の場合は「com.sample.jconsole.JConsoleDemo」)」を選択し、
       「接続」ボタン押下(「保護されていない接続」ボタン押下)
 => メモリやスレッドなどパフォーマンス情報が表示されるはず

サンプルプログラム

package com.sample.jconsole;

public class JConsoleDemo {
  public static void main(String[] args) {
    while (true) {
      System.out.println("Hello World!");
      try {
        Thread.sleep(2_000L);
      } catch (InterruptedException ex) {
        ex.printStackTrace();
      }
    }
  }
}


関連記事

【Tomcat】【JMX】Tomcat を JConsoleで、パフォーマンス監視する

https://blogs.yahoo.co.jp/dk521123/37307119.html

【Tomcat】【JMX】Tomcat を JConsoleで、パフォーマンス監視する

$
0
0

■ JConsoleについて

 * 以下の関連記事を参照のこと。
https://blogs.yahoo.co.jp/dk521123/37307183.html

■ 設定手順

 * はじめの設定として、サーバ側とクライアント側を同じにする

設定環境

 * OS : Windows10
 * Java : JDK1.8.0_111
 * Tomcat : tomcat-9.0.0.M26

前提条件

 * JDK/Tomcat をインストールされていること

詳細手順

[1] サーバ側の設定
[1-1] 【Tomvat】/bin/setenv.bat (Linuxならsetenv.sh) を作成し、以下の内容を保存
~~~~~
set CATALINA_OPTS=-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=localhost -Dcom.sun.management.jmxremote.port=10080 -Dcom.sun.management.jmxremote.authenticate=false

【Linux の場合】
export CATALINA_OPTS=-Dcom.sun.management.jmxremote=true ...
~~~~~

[1-2] Tomcat を開始する

 => 【Tomvat】/logs/catalina.yyyy-MM-dd.log を参照すると、以下のように表示。
~~~~~
情報 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcom.sun.management.jmxremote=true
情報 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcom.sun.management.jmxremote.ssl=false
情報 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.rmi.server.hostname=localhost
情報 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcom.sun.management.jmxremote.port=10080
情報 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcom.sun.management.jmxremote.authenticate=false
~~~~~
[2] クライアント側の設定
[2-1] 【JDK】/bin/jconsole.exe をダブルクリックし、JConsole を起動する
[2-2] 「リモート・プロセス」を選択し、
       テキスト欄に「【ホスト名】:【ポート番号】(今回の場合は「localhost:10080」)」を入力し、
       「接続」ボタン押下(「保護されていない接続」ボタン押下)
 => メモリやスレッドなどパフォーマンス情報が表示されるはず


【Tomcat】Tomcat のスレッド制御 ~ Connectorタグ / Executorタグ ~

$
0
0

■ Tomcat のスレッド制御

 * server.xml のタグで制御

  [1] <Connector>タグ
    ... maxThreads / minSpareThreads / acceptCount / connectionTimeout

  [2] <Executor>タグ
    ... maxThreads / minSpareThreads / maxIdleTime

[1] <Connector>タグ

 * クライアントからのリクエストを処理するコネクタの設定
maxThreads
 * リクエスト処理を行う<Connector>タグで
   処理できるリクエスト処理スレッドの最大数を設定
 * デフォルト値:200
connectionTimeout
 * コネクションを受け付けてからコネクタが待ち受ける時間[ミリ秒]
 * デフォルト値:60000[ミリ秒](1分)

[2] <Executor>タグ

 * 設定することで1つのサービス内でスレッドプールを表わす
maxThreads
 * activeスレッドの最大個数を設定
 * デフォルト値:200
maxThreads
 * 常時即応できるように待機しているスレッドの最小個数を設定
 * デフォルト値:25
maxIdleTime
 * acitveスレッドの個数がminSpareThreadsを超えている場合に、
   アイドル状態のスレッドがシャットダウンするまでの時間[ミリ秒]
 * デフォルト値:60000[ミリ秒](1分)

■ server.xml

<Service name="Catalina"><!--The connectors can use a shared executor, you can define one or more named thread pools--><!--<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
      maxThreads="150" minSpareThreads="4"/>
  -->

 ... 略 ...

  <!--<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
             maxThreads="150" SSLEnabled="true"><SSLHostConfig><Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
                       type="RSA" /></SSLHostConfig></Connector>
  -->

使用上の注意

 * <Executor>タグは、<Connector>タグの前に設定しなければ、
   <Connector>タグに利用されないので注意


関連記事

【Tomcat】設定ファイル server.xml ~ Connector / Attributes 編~

https://blogs.yahoo.co.jp/dk521123/34658624.html

【Tomcat】設定ファイル server.xml ~ Connector / Special Features 編~

https://blogs.yahoo.co.jp/dk521123/35255676.html

【Tomcat 】Tomcat Webアプリケーションマネージャ

$
0
0

■ Tomcat Webアプリケーションマネージャとは?

 * TomcatのGUI管理ツール

どんな事ができる?

[[http://localhost:8080/manager/html/list]]
[a-1] どんなアプリケーションが起動中か・セッション数を一覧表示
[a-2] WARファイルの配備(デプロイ)
[a-3] メモリリークの診断(Diagnostics)を実行
[a-4] サーバ情報(Tomcat/Javaのバージョンなど)を表示
[[http://localhost:8080/manager/status]]
[b-1] JVM(Java仮想マシン)のメモリ設定(Memory Pool/Type/Initial/Total/Maximum/Used)

■ 設定

設定環境

 * OS : Windows10
 * Java : Java v1.8.0-b132
 * Tomcat : Apache Tomcat v9.0.0.M26

設定手順

[1] $CATALINA_HOME/conf/tomcat-users.xml にユーザを追加する
 => 以下「【設定例】$CATALINA_HOME/conf/tomcat-users.xml」の「修正後」を参照のこと。

[2] Tomcat を(再)起動

[3] ブラウザで以下のアドレス(デフォルト設定時)にアクセスする
 => 認証ダイアログが表示されるので、
    [1]で設定したユーザ名、パスワード(今回は「tomcat」「password」)を入力し、OKボタン押下
  => 「Tomcat Webアプリケーションマネージャ」画面が表示されればOK!
[[http://localhost:8080/manager/html]]

【設定例】$CATALINA_HOME/conf/tomcat-users.xml

* 設定例として、Webアプリケーションマネージャのユーザ名、パスワード、ルールを以下のように設定
ユーザ名 :tomcat
パスワード:password
ルール  :manager-gui
修正前
・・・略・・・
<tomcat-users xmlns="http://tomcat.apache.org/xml"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
              version="1.0"><!--
  NOTE:  By default, no user is included in the "manager-gui" role required
  to operate the "/manager/html" web application.  If you wish to use this app,
  you must define such a user - the username and password are arbitrary. It is
  strongly recommended that you do NOT use one of the users in the commented out
  section below since they are intended for use with the examples web
  application.
-->
・・・略・・・
<!--<role rolename="tomcat"/><role rolename="role1"/><user username="tomcat" password="<must-be-changed>" roles="tomcat"/><user username="both" password="<must-be-changed>" roles="tomcat,role1"/><user username="role1" password="<must-be-changed>" roles="role1"/>
--></tomcat-users>
修正後
・・・略・・・
<tomcat-users xmlns="http://tomcat.apache.org/xml"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
              version="1.0"><!--
  NOTE:  By default, no user is included in the "manager-gui" role required
  to operate the "/manager/html" web application.  If you wish to use this app,
  you must define such a user - the username and password are arbitrary. It is
  strongly recommended that you do NOT use one of the users in the commented out
  section below since they are intended for use with the examples web
  application.
-->
・・・略・・・
<!-- Add --><role rolename="manager-gui"/><user username="tomcat" password="password" roles="manager-gui"/><!--<role rolename="tomcat"/><role rolename="role1"/><user username="tomcat" password="<must-be-changed>" roles="tomcat"/><user username="both" password="<must-be-changed>" roles="tomcat,role1"/><user username="role1" password="<must-be-changed>" roles="role1"/>
--></tomcat-users>

【Java】ガベージコレクション ( Barbage Collection; GC )

$
0
0

■ ガベージコレクション

Barbage Collection(GC)
 * 不要になったメモリ領域を自動的に解放する機能

■ GCの種類

[1] マイナーGC / Scavenge GC(スキャベンジ・ジーシー)
[2] メジャーGC / Full GC
Java のメモリ構造については、以下の関連記事を参照のこと。
https://blogs.yahoo.co.jp/dk521123/33622631.html

[1] マイナーGC / Scavenge GC

 * NEW領域のみを対象としたガベージ・コレクション
 * 頻繁に実施
 * インスタンスが不要になるまでの間、From領域とTo領域の間でインスタンスの移動を繰り返す

[2] メジャーGC / Full GC

 * NEWとOLD両方の領域を対象としたガベージ・コレクション

■ GC実行方式の種類

[1] シリアルGC
[2] パラレルGC
[3] コンカレントGC

[1] シリアルGC

 * 全アプリケーションスレッドを停止し、1つのスレッドでGC実行
欠点
 * GCによる停止時間ができてしまう

[2] パラレルGC

 * シリアルGCと同じくすべてのアプリケーションスレッドを停止しながらも複数のスレッドでGCを実行する
 => アプリケーションの停止時間を短縮する(ただし、少なからずアプリケーションスレッドの停止時間は発生する)
欠点
 * GCスレッド間の同期などにオーバーヘッドがかかり、GCスレッドの処理時間が増加する

[3] コンカレントGC

 * アプリケーションスレッドと同時にGCスレッドを動作させること
 => アプリケーションと同時に実行するため、停止時間は短縮
欠点
 * 全体的なスループット(ある単位時間当たりの処理能力)は下がり、応答時間も遅くなる

■ GC関連のオプション

GCログ出力

 -verbose:gc -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:GCLogFileSize=100M -XX:NumberOfGCLogFiles=5
`オプション
`#
説明
1-verbose:gcGCログの有効化
2-Xloggc:【GCログファイルパス】出力したGCログを指定したファイルへ出力する
3-XX:+PrintGCDetailsGCログの詳細表示
4-XX:+PrintGCDateStamps日付/時間を追加
5-XX:+UseGCLogFileRotationGCログのローテーション
6-XX:GCLogFileSize=【GCログファイルサイズ】ローテーションファイルの閾値
7-XX:NumberOfGCLogFiles=【GCログファイル世代数】ローテーションファイルの世代数

コンカレントGCの有効化

 -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode
`オプション
`#
説明
1-XX:+UseConcMarkSweepGCコンカレントGCの有効化
2-XX:+CMSIncrementalModeインクリメンタル・モードの有効化(Java SE 8で非推奨)

補足:Tomcatでの指定

 * CATALINA_OPTS に指定する
  => 具体的には、$CATALINA_HOME/bin/setenv.bat (Windows) に指定
【設定例】$CATALINA_HOME/bin/setenv.bat (Windows)
set CATALINA_OPTS=-verbose:gc -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:GCLogFileSize=100M -XX:NumberOfGCLogFiles=5


関連記事

【Java】 Java のメモリ構造

https://blogs.yahoo.co.jp/dk521123/33622631.html

【Java】JVMのメモリ情報を出力させる

https://blogs.yahoo.co.jp/dk521123/33278121.html

【Java】オブジェクトの使用メモリサイズを測る

https://blogs.yahoo.co.jp/dk521123/32945695.html

【AWS】【JMX】 AWS/EC2上のJConsoleを、GUIで遠隔起動するには...

$
0
0

■ やりたい事

 AWS/EC2/Linux(No GUI)上のJConsole(以下「環境」の「AWS」)を、
 ローカル上の仮想環境(VMware)のOS(GUI)から、遠隔起動する。

# これを応用すれば、JConsoleだけでなく、JMeter等にも利用できそう

環境

AWS
 * OS   : CentOS7(CUIのみ)
 * Java : Java v1.8
ローカル上の仮想環境(VMware)
 * OS   : CentOS7(GUI)
 * Java : Java v1.8

■ 解決案

https://blogs.yahoo.co.jp/dk521123/37291685.html
でやったsshコマンドのオプション「-X」をつける
ユーザ名「centos」。鍵「public-key-pair.pem」ホスト名「ec2-203-0-113-25.compute-1.amazonaws.com」の場合
sudo ssh -X -l centos -i /home/user/.ssh/public-key-pair.pem ec2-203-0-113-25.compute-1.amazonaws.com jconsole

■ トラブル

【1】エラー「x11 forwarding request failed on channel 0」が返ってくる

 * 上記のコマンドを実行したら、エラー「x11 forwarding request failed on channel 0」が
   返ってきて、JConsoleが起動しない
解決策
 * 以下をインストールする

sudo yum install xauth
参考文献
https://qiita.com/mohi_teak/items/473fda1f03cbd9cc8518

【2】「libXrender.so.1」がないという旨の例外「UnsatisfiedLinkError」が発生する

 * 上記の『【1】エラー「x11 forwarding request failed on channel 0」が返ってくる』を行い
   sshコマンドを実行したら、以下「エラー内容」のように
  「libXrender.so.1」がないという旨の例外「UnsatisfiedLinkError」が発生する
エラー内容
[日本語]
Exception in thread "main" java.lang.UnsatisfiedLinkError: /[JDK Path]/libawt_xawt.so: libXrender.so.1: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません

[英語]
Exception in thread "main" java.lang.UnsatisfiedLinkError: /[JDK Path]/libawt_xawt.so: libXrender.so.1: cannot open shared object file: No such file or director
解決策
 * 以下をインストールする

sudo yum install libXext.x86_64
sudo yum install libXrender.x86_64
sudo yum install libXtst.x86_64
参考文献
https://stackoverflow.com/questions/29741518/centos-error-libxext-so-6-cannot-open-shared-object-file-no-such-file-or-dir

【3】JConsoleのGUI表示が文字化けしている

 * 上記の『【2】「libXrender.so.1」がないという旨の例外「UnsatisfiedLinkError」が発生するる』を行い
   sshコマンドを実行したら、GUIでJConsoleが遠隔起動したが、文字化けを起こしている
  => 文字化けじゃ訳が分からないので、英語でいいから起動したい
解決策
sshコマンドを実行する前に「export LANG=en_US」を実行し
英語表示にする

# 恐らく、日本語表示にする方法もあると思うが、時間がないし、そんな難しい英語じゃないので...

関連記事

【Linux】【コマンド】 ssh コマンド / scp コマンド

https://blogs.yahoo.co.jp/dk521123/37291685.html

【JMX】 JConsole

https://blogs.yahoo.co.jp/dk521123/37307183.html

【Tomcat】【JMX】Tomcat を JConsoleで、パフォーマンス監視する

https://blogs.yahoo.co.jp/dk521123/37307119.html

【トラブル】【Tomcat 】Tomcat Webアプリケーションマネージャで「403 Access Denied」が返ってくる

$
0
0

■ 現象

以下の「環境」下において、
https://blogs.yahoo.co.jp/dk521123/37327908.html
の同様に、設定し、ブラウザで
~~~~
https://【ホスト名】/manager/html/list
~~~~
にアクセスしたら、「403 Access Denied」が表示された。

【調査1】
ローカル上で、
~~~~
curl http://localhost:8080/manager/html/list
~~~~
を実行したところ、「401 Unauthorized」が返ってきた。

 => ただ、これは、Basic認証を通していないので、正常動作。
 => 設定自体は問題なさそう

環境

 * OS     : CentOS7
 * Tomcat : Tomcat v8.5
 * JDK    : Java1.8

■ 原因

デフォルトでは、
$CATALINA_HOME/webapps/manager/META-INF/context.xml
で、ローカル以外のアクセスしないように
アクセス制限している

■ 解決策

$CATALINA_HOME/webapps/manager/META-INF/context.xml
を、以下「修正後」のように修正する

$CATALINA_HOME/webapps/manager/META-INF/context.xml

修正前
<Context antiResourceLocking="false" privileged="true" ><Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /><Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/></Context>
修正後
<Context antiResourceLocking="false" privileged="true" ><!-- Comment Out<Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
  --><Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/></Context>

関連記事

【Tomcat 】Tomcat Webアプリケーションマネージャ

https://blogs.yahoo.co.jp/dk521123/37327908.html

【Linux】スワップ領域 (Swap) について

$
0
0

■ 用語整理

スワップ領域

 * 実メモリが枯渇した場合、一時的にハードディスクに退避するための領域
  => ただし、実メモリと比較すると、格段に遅い

スワップアウト(swap-out)

 * メモリからハードディスクに退避する動作

スワップイン(swap-in)

 * メモリからハードディスクに書き戻す動作

■ スワップ領域作成

設定環境

 * OS : CentOS7

設定手順

0) 現状確認
0-1) コマンド「swapon -s」「free -m」で、Swapが設定されているか確認する
~~~~~~~
swapon -s
# ★ 特に何も表示されていなければ、Swap領域は設定されていない

free -m
              total        used        free      shared  buff/cache   available
Mem:           1823        1553          77           3         192          69
Swap:             0           0           0 <= ★ total が「0」なら、Swap領域は設定されていない
~~~~~~~

0-2) コマンド「df -h」で、使用可能なハードディスク領域を確認する
~~~~~~~
df -h

ファイルシス            サイズ  使用  残り 使用% マウント位置
/dev/mapper/centos-root    18G   11G  7.4G   58% /       <= ★ 残り領域「7.4G」を確認
devtmpfs                  897M     0  897M    0% /dev
tmpfs                     912M  2.1M  910M    1% /dev/shm
tmpfs                     912M  9.0M  903M    1% /run
・・・略・・・
~~~~~~~
1) Swap領域作成
1-1) コマンド「dd」で、ファイルを作成する
~~~~~~~
sudo dd if=/dev/zero of=/swapfile bs=1MiB count=2048
~~~~~~~

1-2) コマンド「ls -lh」で、確認
~~~~~~~
ls -lh /swapfile
-rw-r--r--. 1 root root 2.0G  1月 10 22:59 /swapfile
~~~~~~~

1-3) コマンド「chmod」でアクセス権を設定
~~~~~~~
sudo chmod 600 /swapfile

# 確認
ls -lh /swapfile
-rw-------. 1 root root 2.0G  1月 10 22:59 /swapfile
~~~~~~~

1-4) コマンド「mkswap」でSwap領域を作成する
~~~~~~~
sudo mkswap /swapfile
スワップ空間バージョン1を設定します、サイズ = 2097148 KiB
ラベルはありません, UUID=8150d9f0-af2c-4s67-a34s-de42ed23a32e
~~~~~~~

1-5) コマンド「swapon」でSwap領域を有効化する
~~~~~~~
sudo swapon /swapfile
~~~~~~~

1-6) コマンド「swapon -s」「free -m」でSwap領域を確認する
~~~~~~~
swapon -s
Filename                Type        Size    Used    Priority
/swapfile               file        2097148	0	-1

free -m
              total        used        free      shared  buff/cache   available
Mem:           1823        1291          70           3         461         322
Swap:          2045           0        2045
~~~~~~~
2) Swap領域の永続化
2-1) 「/etc/fstab」を修正し、Swap領域の永続化する
~~~~~~~
sudo vi /etc/fstab
で、最終行に以下を記入
/swapfile   swap    swap    sw  0   0
~~~~~~~
【任意設定】3) swappiness(メモリスワップの度合いを調整)
3-1) swappinessを確認するためにコマンド「cat /proc/sys/vm/swappiness」を実行する
~~~~~~~
cat /proc/sys/vm/swappiness
30
~~~~~~~

3-2) コマンド「sysctl vm.swappiness=【設定値(0から100)】」でswappinessを変更する
~~~~~~~
sudo sysctl vm.swappiness=10

cat /proc/sys/vm/swappiness
10
~~~~~~~

3-3) カーネルパラメータを設定する為の設定ファイル「/etc/sysctl.conf」を修正
~~~~~~~
sudo vi /etc/sysctl.conf
で、最終行に以下を記入
vm.swappiness = 10
~~~~~~~
【任意設定】4) vfs_cache_pressure(説明は以下のサイト参照)
https://qiita.com/komeda-shinji/items/c76a5f75b959e4152f91
4-1) vfs_cache_pressureを確認するためにコマンド「cat /proc/sys/vm/vfs_cache_pressure」を実行する
~~~~~~~
cat /proc/sys/vm/vfs_cache_pressure
100
~~~~~~~

4-2) コマンド「sysctl vm.vfs_cache_pressure=【設定値(0~)】」でvfs_cache_pressureを変更する
~~~~~~~
sudo sysctl vm.vfs_cache_pressure=50

cat /proc/sys/vm/vfs_cache_pressure
50
~~~~~~~

4-3) カーネルパラメータを設定する為の設定ファイル「/etc/sysctl.conf」を修正
~~~~~~~
sudo vi /etc/sysctl.conf
で、最終行に以下を記入
vm.vfs_cache_pressure = 50
~~~~~~~

【Linux】コマンドの定期実行を考える ~ watch など~

$
0
0

■ watch

構文

watch -n 【間隔[秒]】 【コマンド】

■ cron

 * 以下の関連記事を参照のこと。
https://blogs.yahoo.co.jp/dk521123/36463384.html

■ その他

 * コマンドではないが、シェル実行で実現する


関連記事

【Linux】 cronデーモン / crontabコマンド

https://blogs.yahoo.co.jp/dk521123/36463384.html

【負荷テスト】 【JMeter】JMeter ~ 基礎知識編 ~

$
0
0

■ JMeter

 * Java製のオープンソース

用途

 * 負荷テスト
 * パフォーマンス計測

■ 用語

`用語
`#
説明
1スループット(Throughput)単位時間あたりの処理量
2Ramp-Up期間全スレッドを生成するまでの時間[秒]
3RPS(目標リクエスト毎秒)負荷試験の目標とするスループット値
https://dev.classmethod.jp/server-side/jmeter-master-slave-settings-by-rps/

補足

Ramp-Up期間
例:スレッド10 / Ramp-Up期間100を設定した場合

 => 初めに、スレッド10を生成するのに、100秒掛かる

関連記事

【負荷テスト】 【JMeter】JMeter ~ 基礎知識編 ~

https://blogs.yahoo.co.jp/dk521123/37336527.html

【負荷テスト】 【JMeter】JMeter ~ Windows環境構築編 ~

https://blogs.yahoo.co.jp/dk521123/37280266.html

【負荷テスト】 【JMeter】JMeter ~ Linux環境構築編 ~

https://blogs.yahoo.co.jp/dk521123/37294248.html

【負荷テスト】 【JMeter】JMeter ~ プラグイン導入編 ~

https://blogs.yahoo.co.jp/dk521123/37294416.html

【負荷テスト】 【JMeter】JMeter ~ CSV読み込み編 ~

https://blogs.yahoo.co.jp/dk521123/36912021.html

【負荷テスト】 【JMeter】JMeter ~ Webサービス / SOAP 編 ~

https://blogs.yahoo.co.jp/dk521123/36908158.html

【負荷テスト】 【JMeter】JMeter ~ メモリ不足時の対処 ~

https://blogs.yahoo.co.jp/dk521123/36937382.html

【負荷テスト】 【JMeter】JMeter ~ あれこれ 編 ~

https://blogs.yahoo.co.jp/dk521123/36910281.html

【AWS】AWS での 負荷テスト あれこれ

【AWS】ロードバランサ ~ HTTP 502: Bad Gateway」が表示された場合 ~

$
0
0

■ HTTP 502: Bad Gatewayの発生原因

まず、発生原因について
https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-troubleshooting.html#http-502-issues
より抜粋
考えられる原因:

 + 接続の確立を試みているときに、ロードバランサーがターゲットから TCP RST を受信した。
 + ロードバランサーにターゲットへの未処理のリクエストがあるときに、
   ターゲットが TCP RST または TCP FIN との接続を閉じた。
 + ターゲットのレスポンス形式が正しくないか、有効でない HTTP ヘッダーが含まれている。
 + 新しいターゲットグループが使用されたが、最初のヘルスチェックに合格したターゲットがまだない。
   ターゲットが正常と見なされるには、1 つのヘルスチェックに合格する必要があります。

■ 切り分け作業

 * 『「ロードバランサ(又はサーバ外)」が原因』なのか『「サーバ側(EC2)」が原因』なのかを
   切り分ける必要がある
【構成例】
+----------------+       +----------------+       +----------------+       +----------------+
| クライアント側 | <===> | ロードバランサ | <===> | サーバ側(EC2)  | <===> | データベース側 |
+----------------+       +----------------+       +----------------+       +----------------+
【切り分けするために確認方法 / 確認項目】
[1] ロードバランサのアクセスログをONにする
[2] ロードバランサの状態は「healthy」になっているか確認 / サーバ側のアクセスログを確認
[3] 「サーバ側(EC2)」のTCPのダンプをとる
[4] netstatコマンドで、ポートが枯渇していないか確認

[1] ロードバランサのアクセスログをONにする

 * ロードバランサのアクセスログは、デフォルトで無効なので
   AWSマネジメントコンソールから有効化にしておく

[2] ロードバランサの状態は「healthy」になっているか確認 / サーバ側のアクセスログを確認

「ロードバランサ」側の確認
 * 対象が「healthy」になっているか確認
  => 「healthy」以外の場合、ヘルスチェックの条件やヘルスチェック先を確認し、
      『「サーバ側(EC2)」側の確認』を行う
「サーバ側(EC2)」側の確認
 * 「サーバ側(EC2)」のアクセスログを確認し、該当する時間帯に対象のリクエストが来ているか確認する
 * できれば処理時間を表示できるといい
  => ヘルスチェックの条件の規定値内にレスポンスが返っていないか確かめるため
  => Tomcatのアクセスログの処理時間を出力する方法は以下の関連記事を参照のこと。
https://blogs.yahoo.co.jp/dk521123/33222763.html

[3] 「サーバ側(EC2)」のTCPのダンプをとる

目的
 * 上記の原因(「TCP RST」を送信していないか)を確認するため
  => RST送っていたら、「サーバ側(EC2)」以降が原因で、ログ(syslogなど)で原因究明を試みる
方法
 * Linuxの場合、tcpdumpでTCPダンプログをとり、そのログをWiresharkなどのソフトで開き、確認
https://blogs.yahoo.co.jp/dk521123/36975273.html
https://blogs.yahoo.co.jp/dk521123/31486925.html
補足
 * ハードディスクの空き容量を確認し、十分に空きがあることを確認してから行う事
  => 容易にハードディスクが枯渇できるので、不要なログをとらないようにフィルタするようにする

[4] netstatコマンドで、ポートが枯渇していないか確認

 * ポートが枯渇していないかnetstatコマンド(例えば、「netstat -an | wc -l」など)で確認
 * netstatコマンドについては、以下の関連記事を参照のこと。
https://blogs.yahoo.co.jp/dk521123/34848875.html
補足 : エフェメラル ポート
 * エフェメラル ポートについては、以下の関連記事を参照のこと。
https://blogs.yahoo.co.jp/dk521123/34703712.html

関連記事

【AWS】ロードバランサ ~ ELB (Elastic Load Balancing) / 入門編 ~
https://blogs.yahoo.co.jp/dk521123/36713623.html

[3] 「サーバ側(EC2)」のTCPのダンプをとる

【Linux】tcpdump ~パケットキャプチャ~
https://blogs.yahoo.co.jp/dk521123/36975273.html
Wireshark ~パケットキャプチャ~
https://blogs.yahoo.co.jp/dk521123/31486925.html

[4] netstatコマンドで、ポートが枯渇していないか確認

【Linux】【Windows】 netstat ~ ネットワーク統計や状態を確認 ~
https://blogs.yahoo.co.jp/dk521123/34848875.html
【ネットワーク】ポート番号
https://blogs.yahoo.co.jp/dk521123/34703712.html

【Linux】netstatコマンドで TIME_WAIT が大量に発生する

$
0
0

■ はじめに

 * 負荷テストを行っている時に、netstatコマンドを入力したら、
   大量に TIME_WAIT が表示された。
   (今回は、データベースとの接続で大量に発生していた)

■ どんな事になるのか?

 OSでは使用できるポート(「エフェメラル ポート / 動的 ポート」)の範囲が決まっている。
あまりにも、大量に TIME_WAIT が発生すると、ポートが枯渇して通信ができなくなる
 => netstatコマンド(オプション -o)で観察すると、
    タイマー(デフォルト60秒)が切れると、TIME_WAIT が消えていく
「エフェメラル ポート / 動的 ポート」については、以下の関連記事を参照のこと。
https://blogs.yahoo.co.jp/dk521123/34703712.html

■ ポートの数を調べるには?

ip_local_post_range を参照する
cat /proc/sys/net/ipv4/ip_local_port_range
32768	60999

上記の場合
60999 - 32768 + 1 = 28232 が使用可能
現在のTIME_WAITの発生数をカウントする
sudo netstat -anp|grep TIME_WAIT|wc -l
2134

■ 対応策

 * net.ipv4.tcp_tw_reuse / net.ipv4.tcp_fin_timeout でチューニングする

手順例

[1] /etc/sysctl.conf を修正し、net.ipv4.tcp_tw_reuse / net.ipv4.tcp_fin_timeoutを設定する
sudo vi /etc/sysctl.conf
~~~~
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
~~~~
[2] sysctl -p で、パラメータを反映する
sudo sysctl -p

補足:「net.ipv4.tcp_tw_recycle」について

 * 「net.ipv4.tcp_tw_recycle」は、いじらない方がいい
 * Linux バージョン4.12から廃止
http://d.hatena.ne.jp/pullphone/20120511/1336722675
https://qiita.com/tmshn/items/b49f1b51bfc472968b30


関連記事

【Linux】【Windows】 netstat ~ ネットワーク統計や状態を確認 ~

https://blogs.yahoo.co.jp/dk521123/34848875.html

トランスポート層 ~ TCP / UDP ~

https://blogs.yahoo.co.jp/dk521123/31343326.html

【ネットワーク】ポート番号

https://blogs.yahoo.co.jp/dk521123/34703712.html

【Tomcat】 Tomcat のメモリあれこれ

$
0
0

■ メモリ最大/初期使用量を設定する

 * CATALINA_OPTSに以下の設定に明示的に値を指定する
  + -Xmx:メモリ最大使用量
  + -Xms:メモリ初期使用量
 * 具体的には、$CATALINA_HOME/bin/setenv.bat (Windows)、setenv.sh (Linux) に指定(以下の「設定例」を参照)

設定例

$CATALINA_HOME/bin/setenv.sh (Linux)
#!/bin/sh

CATALINA_OPTS="-Xmx512m -Xms256m"

設定値目安

 * メモリ最大使用量(-Xmx) : 搭載メモリの半分程度
 * メモリ初期使用量(-Xms) : Xmxの半分程度

参考文献

https://docs.oracle.com/cd/E53142_01/integrator.311/integrator_install/src/cli_ldi_server_config.html
http://www.kumoyanet.com/514/
https://groupsession.jp/support/setup_08.html

関連記事

Tomcat ログあれこれ

https://blogs.yahoo.co.jp/dk521123/33222763.html

【Tomcat】Tomcat管理ツール Probe

$
0
0

■ はじめに

Tomcat Webアプリケーションマネージャと
https://blogs.yahoo.co.jp/dk521123/37327908.html
JConsole
https://blogs.yahoo.co.jp/dk521123/37307119.html
を両方行ったツールが以下のサイトで紹介されてたので試してみた
https://qiita.com/tamura__246/items/1a06f62f582f6ef94d4a

■ 設定

設定環境

 * OS : Windows10
 * Java : Java v1.8.0-b132
 * Tomcat : Apache Tomcat v9.0.0.M26

設定手順

[1] $CATALINA_HOME/conf/tomcat-users.xml にユーザを追加する
 => 以下「【設定例】$CATALINA_HOME/conf/tomcat-users.xml」の「修正後」を参照のこと。

[2] $CATALINA_HOME/bin/setenv.bat (Linuxならsetenv.sh) を作成し、
    以下「【設定例2】setenv」の内容を保存

[3] 以下のサイトから最新のwarファイル「probe.war」を、
    $CATALINA_HOME/webapps配下に置く
https://github.com/psi-probe/psi-probe/releases
[4] Tomcat を(再)起動

[4] ブラウザで以下のアドレス(デフォルト設定時)にアクセスする
 => 認証ダイアログが表示されるので、
    [1]で設定したユーザ名、パスワード(今回は「tomcat」「password」)を入力し、OKボタン押下
  => 「Tomcat Webアプリケーションマネージャ」画面が表示されればOK!
[[http://localhost:8080/probe/]]

【設定例1】tomcat-users.xml

$CATALINA_HOME/conf/tomcat-users.xml
 * 設定例として、Webアプリケーションマネージャのユーザ名、パスワード、ルールを以下のように設定

ユーザ名 :tomcat
パスワード:password
ルール  :manager-gui
修正前
・・・略・・・
<tomcat-users xmlns="http://tomcat.apache.org/xml"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
              version="1.0"><!--
  NOTE:  By default, no user is included in the "manager-gui" role required
  to operate the "/manager/html" web application.  If you wish to use this app,
  you must define such a user - the username and password are arbitrary. It is
  strongly recommended that you do NOT use one of the users in the commented out
  section below since they are intended for use with the examples web
  application.
-->
・・・略・・・
<!--<role rolename="tomcat"/><role rolename="role1"/><user username="tomcat" password="<must-be-changed>" roles="tomcat"/><user username="both" password="<must-be-changed>" roles="tomcat,role1"/><user username="role1" password="<must-be-changed>" roles="role1"/>
--></tomcat-users>
修正後
・・・略・・・
<tomcat-users xmlns="http://tomcat.apache.org/xml"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
              version="1.0"><!--
  NOTE:  By default, no user is included in the "manager-gui" role required
  to operate the "/manager/html" web application.  If you wish to use this app,
  you must define such a user - the username and password are arbitrary. It is
  strongly recommended that you do NOT use one of the users in the commented out
  section below since they are intended for use with the examples web
  application.
-->
・・・略・・・
<!-- Add --><role rolename="probeuser" /><role rolename="poweruser" /><role rolename="poweruserplus" /><role rolename="manager-gui"/><user username="tomcat" password="password" roles="manager-gui"/><!--<role rolename="tomcat"/><role rolename="role1"/><user username="tomcat" password="<must-be-changed>" roles="tomcat"/><user username="both" password="<must-be-changed>" roles="tomcat,role1"/><user username="role1" password="<must-be-changed>" roles="role1"/>
--></tomcat-users>

【設定例2】setenv

$CATALINA_HOME/bin/setenv.sh (Linux)
#!/bin/sh

CATALINA_OPTS="com.sun.management.jmxremote=true"
$CATALINA_HOME/bin/setenv.bat (Windows)
set CATALINA_OPTS=-Dcom.sun.management.jmxremote=true


関連記事

【Tomcat】Tomcat Webアプリケーションマネージャ

https://blogs.yahoo.co.jp/dk521123/37327908.html

【Tomcat】【JMX】Tomcat を JConsoleで、パフォーマンス監視する

https://blogs.yahoo.co.jp/dk521123/37307119.html

【負荷テスト】 【JMeter】JMeter ~ コントローラ 編 ~

$
0
0

■ Ifコントローラ

 * 分岐

追加方法

 * 右クリックし、[追加]-[ロジックコントローラ]-[Ifコントローラ]を選択

使用上の注意

 * 負荷の上限が落ち込む可能性がある

参考文献

http://seesaawiki.jp/w/susatadahiro/d/%A5%B3%A5%F3%A5%C8%A5%ED%A1%BC%A5%E9%A1%CAIF%A5%B3%A5%F3%A5%C8%A5%ED%A1%BC%A5%E9%A1%CB

■ ループコントローラ

 * 繰り返し

追加方法

 * 右クリックし、[追加]-[ロジックコントローラ]-[ループコントローラ]を選択

参考文献

http://sy5.sakura.ne.jp/jmeter/ref/contoller/loopcontroller.html

■ 正規表現抽出

 * 正規表現で値を抽出

追加方法

 * 右クリックし、[追加]-[後処理]-[正規表現抽出]を選択

サンプル

「"id":"X0001"」の「value = X0001」と設定したい
参照名:value
正規表現:"id":"(.*)"
テンプレート:$1$
一致番号:0
補足:数字の場合
正規表現:"id":"([0-9]+)"

参考文献

http://sy5.sakura.ne.jp/jmeter/ref/postprocessors/regularexpressionextractor.html
http://naoberry.com/jmeter/regex/
http://d.hatena.ne.jp/sekom/20110212/p1

関連記事

【負荷テスト】 【JMeter】JMeter ~ 基礎知識編 ~

https://blogs.yahoo.co.jp/dk521123/37336527.html

【負荷テスト】 【JMeter】JMeter ~ あれこれ 編 ~

https://blogs.yahoo.co.jp/dk521123/36910281.html

【MySQL】【Aurora】 実行時間が掛かるSQLの監視手法

$
0
0

■ 実行時間が掛かるSQLの監視手法

[1] show full processlist で、実行中のSQLを表示する
[2] slow_query_log / long_query_time を使って、遅いクエリを特定する

[1] show full processlist で、実行中のSQLを表示する

G オプションでクエリ結果を垂直表示になる
mysql> SHOW FULL PROCESSLIST \G;

参考文献

https://qiita.com/akokubu/items/8395cde296c76f263973
http://d.hatena.ne.jp/takami_hiroki/20101027/p1

[2] slow_query_log / long_query_time を使って、遅いクエリを特定する

slow_query_log (スロークエリーログ)
 * スロークエリーログは、long_query_time を超えたらログ出力
long_query_time
 * デフォルトは、10[秒]

参考文献

http://gihyo.jp/dev/serial/01/mysql-road-construction-news/0007
https://dev.mysql.com/doc/refman/5.6/ja/slow-query-log.html
Viewing all 860 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>