実践的なJavaアプリケーションサーバの構築・運用 ―転ばぬ先の杖― 製品・保守事業推進本部 ミドルウェア技術サポート部 山田 貴裕 2015/04/08 Copyright (c)2015 ITOCHU Techno-Solutions Corporation 免責事項 • Oracle と Java は、Oracle Corporation およびその子会社・ 関連会社の米国およびその他の国における登録商標です。 文中の社名・商品名などは、各社の商標または登録商標である 場合があります。 • 本資料に掲載の内容は、予告なく変更されることがあります。 また、本資料を使用したことにより被った直接的・間接的な 損害などについて、いかなる責任も負いかねます。 • 本資料の再配布および無断転載を固くお断りします。 Copyright (c)2015 ITOCHU Techno-Solutions Corporation 自己紹介 • 伊藤忠テクノソリューションズ株式会社(CTC)所属 – Javaをベースとしたミドルウェア製品の構築・サポート • 大規模案件にも従事し、設計や構築を担当 • Oracle ACE (Middleware & SOA) – ミドルウェア分野では日本で実質的に一人 Copyright (c)2015 ITOCHU Techno-Solutions Corporation 会社情報 : 会社概要 2015年4月1日現在 会 社 名 (略称 CTC) 英 文 社 名 本社所在地 〒100-6080 東京都千代田区霞が関3-2-5 霞が関ビル TEL 03-6203-5000 (代) URL http://www.ctc-g.co.jp/ 代 者 代表取締役社長 立 1972年 (昭和47年) 4月1日 表 創 菊地 哲 資 本 金 21,763百万円 社 員 数 3,919名 (CTCグループ 7,960名、2014年4月1日現在) 事 業 内 容 コンピュータ・ネットワークシステムの販売・保守、ソフトウェア受託開発、 情報処理サービス、科学・工学系情報サービス、サポート、その他 Copyright (c)2015 ITOCHU Techno-Solutions Corporation 会社情報 : CTCの組織体制 お客様の様々なご要望にお応えできる組織体制です。 5 Copyright (c)2015 ITOCHU Techno-Solutions Corporation 国内トップレベルの実績と経験 長年のオラクルとのパートナーシップ 20年を超える販売パートナー 上位レベルであるPlatinumレベルを継続 幅広い製品・業種での導入実績・技術力 30製品10業種においてオラクルのパートナー公認制度「Specialization」認定を取得 国内での認定数第1位 (2014年7月時点) 国内トップレベルの認定資格者数 認定資格者 : 認定技術者数で国内トップレベル • ORACLE MASTER Platinum、ORACLE MASTER Gold 315名在籍 (2014年9月時点) 数多くの表彰 Global受賞 Oracle Excellence Award Specialized Partner of the Year 2014 Server & Storage Systems [Global] 受賞 Oracle Excellence Award Specialized Partner of the Year 2014 Server & Storage 受賞 Oracle Excellence Award Specialized Partner of the Year 2014 最多3部門受賞 Middleware 受賞 Oracle Excellence Award Specialized Partner of the Year 2014 6 Specialization 受賞 Platinum of the Year 2014 受賞 Oracle Certification Award 2014 全部門受賞 ★Oracle Certified Expert, RAC ★Oracle Certified Expert, Exadata ★Oracle Certified Java Programmer, SE7 ★Oracle Master Platinum Oracle DB 11g (累計取得者数、単年取得者数) ★Oracle Master Oracle DB 12c Copyright (c)2015 ITOCHU Techno-Solutions Corporation 弊社の強みの一つ - WebLogic 日本BEAシステムズ時代 1998年にBEAがWebLogic社を買収する以前より、CTC社内で製品評価を実施 BEA WebLogic Server のリリース初期より代理店として販売・保守を実施 日本BEAシステムズとCTCの共著による運用ガイド本を出版 日本オラクル時代 2008年、オラクルによるBEA買収に伴い、Oracle Fusion Middleware の基盤を担う製品、 Oracle WebLogic Server としてリブランド 引き続き、日本オラクルの代理店として販売、保守サービスを継続 日本オラクルとCTCの共著による運用ガイド本を出版 (2010年12月) WebLogic Server 12c (12.1.1) ベータプログラム参加 WebLogic Server 12c (12.1.2) ベータプログラム参加 提案・構築・保守ともに豊富な実績 【Certified Advantage Partner】を受賞し、Oracle社から最上位パートナーに認定 【Advanced Certified Support Partner】を受賞し、Oracle社からハイレベル なサポートの提供を認められたパートナー 豊富な実績に基づくナレッジDBの保有とWebによるノウハウ情報をご提供 Oracle Award 2011, 2014 Middleware Award受賞 2014 Oracle Excellence Award Specialized Partner of the Year Middleware 受賞 Copyright (c)2015 ITOCHU Techno-Solutions Corporation 前提条件 • 基本的にアプリケーションサーバ製品の種類に依存しない内容 ですが、一部製品でしか利用できないこともあります。 • HotSpot JDK/JVMおよびLinuxをベースとして説明しますが、 他のJDK/JVMやプラットフォームにも応用できる内容です。 • 本資料は、以前JJUG CCCで発表した内容を、2015年4月初め 時点の情報で加筆修正し、再構成したものです。 Copyright (c)2015 ITOCHU Techno-Solutions Corporation 今回の範囲 アプリケーション アプリケーションサーバ Webサーバ JVM DBサーバ コンテナ・OS H/W Copyright (c)2015 ITOCHU Techno-Solutions Corporation アプリケーションサーバの特性 • 長時間の実行 • 複数ユーザからの同時アクセス • アプリケーションとインフラの中間 Copyright (c)2015 ITOCHU Techno-Solutions Corporation アジェンダ • ログ管理 • 監視・統計 • チューニング Copyright (c)2015 ITOCHU Techno-Solutions Corporation ログ管理 • トラブルシューティングの基本 • ログをきちんと出力・取得していないシステムは、 スピードメーターが壊れている車両と同じ Copyright (c)2015 ITOCHU Techno-Solutions Corporation ログの種類 デフォルト 出力有無 種類 説明 用途 サーバログ 製品固有の情報を記録 運用監視 障害解析 ○ アクセスログ HTTPアクセスの情報を記録 稼働統計 障害解析 監査証跡 △ (製品依存) GCログ JVMのGC情報を記録 稼働統計 障害解析 × 標準出力・エラー出力ログ 標準出力・エラー出力を記録 運用監視 障害解析 △ (製品依存) クラッシュログ 障害解析 △ (クラッシュ時) クラッシュ時に出力 Copyright (c)2015 ITOCHU Techno-Solutions Corporation サーバログ • 製品固有のログ – 製品としての障害解析には最も利用 • 多くの場合、起動時のログも必要 – ログレベルは、通常INFO以上にすべき • 監視にも利用 • 詳細情報を出力する場合にはDEBUG – スレッド名・スレッドIDの出力 • 同一スレッドの処理に着目 • アプリケーションのログと突合せ Copyright (c)2015 ITOCHU Techno-Solutions Corporation アクセスログ • HTTP/HTTPS経由のアクセスを出力 • デフォルトで無効になっている製品もあるが有効化すべき – Webサーバとアプリケーションサーバのどちら側の問題か判別 – 所要時間も出力するよう設定 • セキュリティ・監査目的でも利用 – 不正アクセス・大量アクセスの調査 – 操作履歴のトレース Copyright (c)2015 ITOCHU Techno-Solutions Corporation GCログ GCチューニング、メモリリークやOutOfMemoryError(OOME)分析に必須 オプション -verbose:gc -Xloggc:{file} -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCCause -XX:+UseGCLogFileRotation 説明 GC情報を出力(基本) GC情報を指定されたファイルに出力 タイムスタンプ(日時)を出力 6u3までは -XX:+PrintGCTimeStamps(起動時からの 経過時間)のみ GCの詳細情報を出力 GCの発生原因を出力 (7u40以降、8でデフォルト有効) GCログのローテーションを有効化 (7u2・6u34以降) -XX:NumberOfGCLogFiles={n} -XX:GCLogFileSize={size} も指定 Copyright (c)2015 ITOCHU Techno-Solutions Corporation GCログの解析例 - GCViewer chewiebug/GCViewer · GitHub https://github.com/chewiebug/GCViewer/ Copyright (c)2015 ITOCHU Techno-Solutions Corporation GCログ運用時の注意点 • GCログの上書きに注意 – 再起動前に退避 – e.g. -Xloggc:gc-`date +%Y%m%d_%H%M%S`.log • JDK 8・7u76以降では -Xloggc:gc-%p-%t.log • OSコマンドでの強制ローテーションは、大抵正常動作せず – e.g. logrotateによるcopytruncate – ファイルポジションが戻らず、先頭がNUL文字になるだけ – JDK 8u20・7u76以降では外部からローテーション可能 • jcmd {PID} GC.rotate_log • -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles={n} -XX:GCLogFileSize={size} オプションも併せて指定 Copyright (c)2015 ITOCHU Techno-Solutions Corporation [参考] ヒープ詳細解析に必要な情報 • 簡易的にはヒストグラムを定期的に取得して比較 – jmap -histo:live {PID} – jcmd {PID} GC.class_histogram (7u4以降) 負荷:中 • ヒープダンプは、最低2回取得して差分を解析 – 通常時 • jmap -dump:live,format=b,file={file} {PID} • jcmd {PID} GC.heap_dump {file} (7u4以降) 負荷:高 – OOME発生時 • -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath={path} • OOME発生後にはJVMとしての動作が保証されないので、必ず再起動 – 必要に応じて、-XX:OnOutOfMemoryError='kill -ABRT %p' なども併せて指定 Copyright (c)2015 ITOCHU Techno-Solutions Corporation 標準出力・エラー出力ログ • スレッドダンプやOOMEなど、JVM本体の出力を捕捉するため OSレベルでリダイレクト – スレッドダンプ(kill -3 {PID})は、以下で代用も可能 • jstack {PID} • jcmd {PID} Thread.print (7u4以降) – 環境によっては以下オプションを利用 -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile={file} – アプリケーションでSystem.outやSystem.errの利用を極力排除 • System.setOutやSystem.setErrを使うことで、(製品によっては設定ベースで) 別ファイルに出力するようにできるが、JVM本体の出力とは別 Copyright (c)2015 ITOCHU Techno-Solutions Corporation スレッドダンプの解析例 - ThreadLogic ThreadLogic — Project Kenai https://java.net/projects/threadlogic/ Copyright (c)2015 ITOCHU Techno-Solutions Corporation スレッドダンプの解析例 - 侍 侍 - ログ , スレッドダンプ解析ツール http://samuraism.jp/samurai/ % Copyright (c)2015 ITOCHU Techno-Solutions Corporation 標準出力・エラー出力ログ運用時の注意点 • ローテーションにはApache付属のrotatelogsなどを利用 – java 〜 2>&1 | rotatelogs -l console.log.%Y%m%d 86400 – ログの削除は、別途検討 – GCログがローテーションできないJVMを利用している場合、 標準出力・エラー出力ログに出力し、併せてローテーション • java 〜 >/dev/null 2>&1 は、基本的に禁止 Copyright (c)2015 ITOCHU Techno-Solutions Corporation クラッシュログ • hs_err_pid{PID}.log – デフォルトではJVM起動時のカレントディレクトリに出力 – -XX:ErrorFile={file} で出力先を指定 • JVMクラッシュする要因 – ネイティブライブラリの誤用・不具合 – JVM自体の不具合 – OOMEやStackOverFlowError • 発生ライブラリやスタックトレースを基に既知不具合を確認 Copyright (c)2015 ITOCHU Techno-Solutions Corporation 監視・統計 • トラブルを未然に防いだり、早期発見につなげる • 傾向を分析し、サイジングの礎とする Copyright (c)2015 ITOCHU Techno-Solutions Corporation OSリソースの監視・統計 • CPU – 使用率、キュー長 • メモリ – 使用量、ページング • ネットワーク – ソケット状況、I/O発生量 • プロセス単位の情報取得 – 上記までをプロセス単位に識別できるよう取得 • e.g. netstat -anp, ps auxww – JVMによるCPU高負荷時にはスレッド単位のCPU使用率も取得 • e.g. top -b -H -p {PID} -n {count}, ps auxww -L Copyright (c)2015 ITOCHU Techno-Solutions Corporation OSリソースの監視例 - vmstat procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----r b swpd free inact active si so bi bo in cs us sy id wa st 1 0 0 5772388 548932 888980 0 0 0 48 17 17 4 1 94 0 0 0 0 0 5770884 548932 890680 0 0 0 0 45 41 1 0 99 0 0 3 0 0 5732472 548964 928772 0 0 0 4 848 563 56 11 34 0 0 0 0 0 5770768 548928 890304 0 0 0 88 418 226 38 5 57 1 0 0 0 0 5770908 548928 890304 0 0 0 0 18 27 0 0 100 0 0 CPU割当や I/O待ちとなっているプロセス CPU使用率 スワップイン・スワップアウトしているメモリ量 Tips: vmstatの結果と併せて日時を出力 $ vmstat 5 | awk '{print strftime("%Y-%m-%d %H:%M:%S"), $0}' Copyright (c)2015 ITOCHU Techno-Solutions Corporation プロセス監視、ヘルスチェック • プロセス監視 – OSコマンドの場合、必要なプロセスのみに限定 • ps -ef | grep java | grep -v grep | grep ~ – JDKツールの場合、対象JVMと実行ユーザが同一であることや、 /tmp/hsperfdata_{user} が実行時に削除されないように注意 • jps -mlv | grep ~ • ヘルスチェック – 実際にリクエストを投げて応答を確認 • e.g. curl, wget – Full GCを考慮してタイムアウトやリトライを実装 Copyright (c)2015 ITOCHU Techno-Solutions Corporation ログ監視・統計 • ログ – サーバログは、ERRORレベル以上を基本的に監視 • WARNINGの監視は、大体において過剰 – サーバログだけではなく、標準出力・エラー出力ログも監視 • OOMEやStackOverFlowErrorを捕捉 • 製品によってはサーバログの重要度が高い内容も出力 – GCログやアクセスログから統計 • e.g. GC回数、平均所要時間 • e.g. HTTPステータス(1xx~5xx)ごとの件数、平均レスポンス時間 Copyright (c)2015 ITOCHU Techno-Solutions Corporation GC統計 • jstat – 統計情報として取得するには有用 – GCフェーズや詳細なタイミングが不明 • 障害解析には不適切 $ jstat -gcutil -t ${PID} 10s Timestamp 9.4 19.4 29.4 39.4 49.4 59.4 S0 0.00 99.97 99.97 72.62 0.00 0.00 S1 0.00 0.00 0.00 0.00 99.94 0.00 E 62.41 3.82 4.22 11.24 54.02 11.73 O 11.73 17.34 17.34 12.83 13.94 23.00 M 98.30 98.53 98.53 98.47 98.45 98.53 CCS 96.21 97.47 97.47 97.25 96.99 96.54 YGC 5 8 8 10 11 14 YGCT 0.112 0.163 0.163 0.211 0.232 0.329 FGC 3 3 3 4 4 5 FGCT 0.288 0.288 0.288 0.433 0.433 0.975 GCT 0.399 0.451 0.451 0.644 0.665 1.304 Copyright (c)2015 ITOCHU Techno-Solutions Corporation サーバリソース監視・統計 • JMXやREST APIによるリソース監視・統計 e.g. – ヒープ使用量、GC回数 – 実行中のスレッド数、リクエストキュー長 – HTTPセッション数 – コネクションプールの使用数、空き待ち数 etc. ※現在値だけでなく、最大値も可能であれば取得 Copyright (c)2015 ITOCHU Techno-Solutions Corporation JMXによる監視例 - Java Mission Control Java Mission Control http://www.oracle.com/technetwork/jp/java/javaseproducts/mission-control/ Copyright (c)2015 ITOCHU Techno-Solutions Corporation JMXによる監視例 - 虚無僧 虚無僧2.0 http://samuraism.jp/komuso/ $ ./komuso.sh XXX.properties Timestamp,HeapFreePercent,State,ExecuteThreadTotalCount,ExecuteThreadIdleCount,Stand byThreadCount,PendingUserRequestCount,OverloadRejectedRequestsCount,StuckThreadCount 2015/03/21 23:33:01 JST,83,RUNNING,5,1,4,0,0,0 2015/03/21 23:33:02 JST,81,RUNNING,5,0,2,1,0,0 2015/03/21 23:33:03 JST,78,RUNNING,5,0,2,3,0,0 2015/03/21 23:33:04 JST,70,RUNNING,5,0,2,7,0,0 2015/03/21 23:33:05 JST,70,RUNNING,5,0,2,8,0,0 2015/03/21 23:33:06 JST,69,RUNNING,5,0,2,5,0,0 2015/03/21 23:33:07 JST,69,RUNNING,5,0,2,4,0,0 2015/03/21 23:33:08 JST,69,RUNNING,5,0,1,2,0,0 2015/03/21 23:33:09 JST,69,FAILED,5,0,1,18,5,0 2015/03/21 23:33:10 JST,69,FAILED,5,0,1,17,11,0 Copyright (c)2015 ITOCHU Techno-Solutions Corporation RESTライクな監視例 - Jolokia Jolokia http://www.jolokia.org/ $ curl "http://localhost:8080/jolokia/read/java.lang:type=Memory/HeapMemoryUsage/" | jq '.' { "request": { "mbean": "java.lang:type=Memory", "attribute": "HeapMemoryUsage", "type": "read" }, "value": { "init": 62914560, "committed": 76021760, "max": 891289600, "used": 43484848 }, "timestamp": 1427698609, "status": 200 } Copyright (c)2015 ITOCHU Techno-Solutions Corporation チューニング • 限られたリソースで最大限の効果を発揮させる • 計測し、ボトルネックを見つける • パフォーマンス向上だけではなく、最適化する Copyright (c)2015 ITOCHU Techno-Solutions Corporation サーバ分割・分散配置 • 複数プロセス、複数コンテナ・OSによって処理 – スレッド間のロック競合、アプリケーション間の影響低減 • パッチ適用・設定変更など再起動が必要な場合 – 計画的に再起動することでリークも解消 アプリケーション アプリケーション アプリケーションサーバ アプリケーションサーバ JVM JVM コンテナ・OS H/W アプリケーション アプリケーション アプリケーションサーバ アプリケーションサーバ JVM JVM コンテナ・OS コンテナ・OS H/W Copyright (c)2015 ITOCHU Techno-Solutions Corporation OS環境設定 • 最低限行うべきもの(Unix) – ファイルディスクリプタ(FD) • e.g. ulimit -n 8192 • 大量のjar読込、ソケット、ファイル • 足りない場合には lsof -n -P -p {PID} で確認 – コアファイルサイズ • ulimit -c unlimited • 出力場所にも注意 (/proc/sys/kernel/core_pattern) • コアファイルは、gdbなどを利用して対象OS上で解析 Copyright (c)2015 ITOCHU Techno-Solutions Corporation ネットワーク関連設定 • TCPタイムアウト – 接続開始: connectのタイムアウト – 接続中: TCP KeepAliveによるポーリング – 接続終了: TIME_WAITのタイムアウト • 接続バックログ • IPv4を優先 – 必要に応じて -Djava.net.preferIPv4Stack=true Copyright (c)2015 ITOCHU Techno-Solutions Corporation JVMメモリの使われ方 アプリケーションサーバでの利用イメージ New リクエストで 利用 Metaspace or Perm + Native Old アプリケーション アプリケーション HttpSession サーバ本体で で固定的に利用 として利用 利用 アプリケーション サーバ本体 アプリケーション 実際には計測してみないと分からないが イメージを持つのは大事 Copyright (c)2015 ITOCHU Techno-Solutions Corporation JVMメモリ・GCのチューニング • JVMメモリ – ヒープサイズ • 最小容量(-Xms)=最大容量(-Xmx) • 大きい場合、GC回数が減少・GC時間が増加 • 小さい場合、GC回数が増加・GC時間が減少 – Metaspace (JDK 8以降) • -XX:MaxMetaspaceSize={size} で制限 (以前 -XX:MaxPermSize={size} 相当) • 一般的なGC方式 – レスポンス重視の場合、-XX:+UseConcMarkSweepGC – スループット重視の場合、-XX:+UseParallelOldGC – CPU・メモリが潤沢な場合、-XX:+UseG1GC (7u4以降) ヒープレイアウトとして、1世代・2世代を選ぶJVMもあり Copyright (c)2015 ITOCHU Techno-Solutions Corporation アプリケーションサーバのよくある構造 接続プール リクエストキュー スレッドプール リクエスト 実行スレッド DB接続 Copyright (c)2015 ITOCHU Techno-Solutions Corporation スレッドのチューニング • 流量制御の要であり、一般的にスレッドプールで再利用 – スレッド数は、TPS×レスポンス時間(秒)を目安 – リクエストキュー長も制限 e.g. 1秒に最大5トランザクション、レスポンス時間が平均2秒 0 1 2 3 4 5秒 Copyright (c)2015 ITOCHU Techno-Solutions Corporation [参考] アプリケーションのスレッドに関する注意点 • ThreadLocalは、注意して利用 – 再デプロイ時にメモリリークの原因 – 再利用前提のスレッドに紐づくため、アプリケーションで明示的に破棄 • 製品によっては再デプロイ時などに自動削除やエラー出力に対応 • スレッドの自前での作成は原則禁止 – Java EEではスレッドに紐づけて、各種リソースを管理 • e.g. トランザクション、セキュリティ – Java EE 7ではConcurrency Utilities for EE Copyright (c)2015 ITOCHU Techno-Solutions Corporation コネクションプールのチューニング • 新規コネクションを張る際のオーバーヘッドを低減 – 基本は、初期容量=最大容量かつスレッド数≧容量 – リソースを適切に制限することが重要 • 容量以外のポイント – ステートメントキャッシュも利用 – ファイアウォールがある場合、 定期的にポーリング – コネクションリークに注意 接続プール DB • Java SE 7のtry-with-resources構文 • 製品機能によって確認・解消 Copyright (c)2015 ITOCHU Techno-Solutions Corporation タイムアウトのチューニング • Javaの特性上、実行タイムアウトを直接的に指定不可 – 以下のような部分で間接的にタイムアウトを指定 • JDBCでのSQL実行 • 外部HTTPアクセス (e.g. HttpClient) • トランザクションタイムアウト etc. • システムとして全体的なタイムアウト設計も実施 – フロント>バックエンドとなるようなタイムアウト設計が基本 • e.g. Webサーバ実行時間>SQL文タイムアウト – トランザクションやHTTP KeepAliveのタイムアウトでは逆 • バックエンドが先にタイムアウトしてしまうと、意図しない挙動の原因 Copyright (c)2015 ITOCHU Techno-Solutions Corporation まとめ • アプリケーションサーバの特性を理解 – 長時間の実行 → ログ管理、監視・統計 – 複数ユーザからの同時アクセス → チューニング – アプリケーションとインフラの中間 → 総合力が大事 • 古いバージョンを利用している方は、アプリケーションサーバ だけでもバージョンアップを検討・実施 – Java SE・Java EEとも互換性を重視 – パフォーマンスの向上、より便利なツールの利用 といっても、なかなかバージョンアップできない環境も多いので… Copyright (c)2015 ITOCHU Techno-Solutions Corporation Oracle Java SE Advancedについて Oracle Java SE Advanced (サーバ環境向け) および Oracle Java SE Advanced Desktop (デスクトップ環境向け) は、Java SEの長期サポートを提供する有償ライセンス製品です。 EOL以降も継続してアップデートリリースをご提供する他、以下のサービスやツール群を ご利用いただけます。 Oracle Java SE Advanced の主な内容 概要 標準オラクル・サポート 24時間365日、27言語対応の電子メール及び電話サポート 「Oracle Premier Support」へのお問い合わせサービス アップデートリリースの提供 バグ修正、セキュリティ問題の修正などを含むアップデートリリースの提供 (EOL後も提供を継続) Java Flight Recorder / Java Mission Control 障害対応を強力に支援する Java の問題解析機能 Oracle Java SE Advanced のサポート・ロードマップ ※ブラウザ経由で実行されるJavaアプリケーション (アプレットなど) の場合、期間の例外あり Java version 提供開始 EOL 標準サポート 終了 延長サポート 終了 無期限 サポート Java SE 6 2006年12月 2013年2月 2015年12月 2018年12月 あり Java SE 7 2011年7月 2015年4月 2019年7月 2022年7月 あり Java SE 8 2014年3月 2017年3月(予) 2022年3月 2025年3月 あり Copyright (c)2015 ITOCHU Techno-Solutions Corporation Copyright (c)2015 ITOCHU Techno-Solutions Corporation
© Copyright 2024 ExpyDoc