VPSサーバーでWebサイト公開 備忘録 ~Linux、MySQLからAJAXまで

VPSサーバーを使ってWebサイトを運用する過程で行った作業、調査内容を備忘としてまとめています。

アーカイブ

vmstatコマンドでシステムの状況をモニター

linuxのvmstatコマンドでシステムの状況をモニターする方法を確認しました。
 

1)vmstatコマンドの概要


 
・メモリ使用量、ディスク使用状況、CPU使用率などの情報を表示。
・引数に数値nを指定するとn秒間隔に測定して結果を表示する。
 
(実行例)

$ vmstat 5
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0  97656 164588 151932 795708    0    0     4    11    0    0  1  0 99  0  0
 0  0  97656 164332 151940 795708    0    0     0    13   61   34  0  0 100  0  0
 0  0  97656 164456 151940 795708    0    0     0     0   63   32  0  0 100  0  0
 0  0  97656 164320 151944 795704    0    0     0    12  108   63  1  0 99  0  0
 0  0  97656 164376 151944 795708    0    0     0     0   61   32  0  0 100  0  0

 

2)表示結果の見方


 
①procs
 
r:実行待ちのプロセス数
b:ブロックされているプロセス数
 
・ブロックされているプロセスは、ハードウェア、特にディスク処理を待機しているため実行できない。
・bの値が高い場合は、ディスクがボトルネックとなっている可能性が高い。
・rがCPUコアの数より多い場合は、性能の低下を引き起こすので要注意。
 
②memory
 
swpd:仮想メモリ(スワップメモリ)がどれだけ使用されているか?
free:アイドルメモリ
buff:バッファとして使用されているメモリ
cache:キャッシュとして使用されているメモリ
 
③swap
 
si:スワップからreadされたバイト(/s)
so:スワップに書き込まれたバイト(/s)
 
・スワップが発生している場合は、物理メモリが不足している。ディスク待ちでブロックされているプロセス数が増加する。
 
④io
 
bi:ブロックデバイス(ハードディスク)からreadされたバイト(blocks/s)
bo:ブロックデバイス(ハードディスク)に書き込んだバイト(blocks/s)
 
・ディスクがボトルネックとなっている場合は、この数値を下げる対策を検討する。
 
⑤system
 
in:CPU割り込みの数(/s)
cs:コンテキストスイッチの数(/s)
 
・コンテキストスイッチは、CPUが処理するプロセスを切替えたり、割り込みを処理する場合などに行われる。この数が著しく高い場合は性能に影響が出る。
 
⑥cpu
 
us:非カーネルのユーザーコードで実行された時間
sy:カーネルのコードで実行された時間
id:アイドルタイム
wa:I/O待ちの時間
st:仮想マシンに使用された時間
 
・waが高い場合は、ioやswapが高くなっていないかチェックする。

AngularJSの基本的なカスタムディレクティブの作成方法

サンプルコードを使ってAngularJSの基本的なカスタムディレクティブの作成方法をまとめてみました。
 
デモとコードサンプルはこちら。
 

(1)サンプルコードの仕様


 
商品リストを表示する下記内容を”productsList”という名前でカスタムディレクティブを使って書き換えてみます。

(カスタムディレクティブ未使用)
<div ng-controller="cus1Ctrl">
  <ol>
    <li ng-repeat='item in products'>
      {{item.product_name}} : {{item.price | number:0}}円
    </li>
  </ol>
</div>
 
(カスタムディレクティブ使用)
<div ng-controller="cus1Ctrl">
  <div products-list="products"></div>
</div>

 

(2)カスタムディレクティブを作成


 

var demoApp = angular.module('demoApp', []);
demoApp.directive("productsList", function () {
  return {
    link: function (scope, element, attrs) {
      scope.data = scope[attrs["productsList"]];
    },
    scope: true,
    template: "<ol><li ng-repeat='item in data'>{{item.product_name}} : {{item.price | number:0}}円</li></ol>",
    restrict: "A"
  }
});

 
1)カスタムディレクティブの定義
 
・モジュールのdirective(directive名,ファクトリ関数)メソッドを使って定義。
demoApp.directive(“productsList”, function () {
 
上記ディレクティブによって、HTMLビュー内の”products-list”と記述された要素、属性がtemplateで定義した内容に置換されます。
 
・ディレクティブの名前は大文字小文字を区別し、”productsList”のようにcamelCaseで正規化される。
 
HTMLは大文字小文字を区別しないので”products-list”のように小文字の”-“区切りを使用します。
 
2)scope属性
 
サンプルでは、scope: trueと指定し、親のスコープ(この例では”cus1Ctrl”コントローラ)を継承した上でカスタムディレクティブ専用に新しい子スコープを生成します。
 
scope属性を明示的に指定していない場合のデフォルトは、scope: falseでカスタムディレクティブは親のスコープを使用し、自由に更新することも出来ます。
 
3)リンク関数
 
HTML内のディレクティブとスコープ内のデータを連結する役割を持ちます。
 
●リンク関数の引数
 
①scope
 
・ディレクティブが適用されるビュー内のscope。
 
scopeでtrueと設定しているので”cus1Ctrl”コントローラの$scope.productsで定義しているデータを参照する事が出来ます。
 
②element
 
・カスタムディレクティブが適用される対象のHTML要素のjqLiteオブジェクトで、jqLiteを使ってDOM操作をナビゲート、操作する事が出来る。
 
※jqLite
AngularJSに同梱されているjQueryの簡易版。
https://docs.angularjs.org/api/ng/function/angular.element
 
・このサンプルでは下記のように使用しているのでdiv要素となる。
<div products-list=”products”>
 
③atts
 
・ディレクティブが適用される対象のHTML要素の属性名(正規化された名前)と値のペアのハッシュオブジェクト。
 
このサンプルでは、カスタムディレクティブをdiv要素の属性として使用しているので、products-listという属性に指定された値をattrs[“productsList”]で取得出来ます。
 
attrs[“productsList”]で属性に指定した値”products”が取得できるので、scope[attrs[“productsList”]]で”cus1Ctrl”コントローラの$scope.productsを参照できます。
 
4)restrict属性
 
カスタムディレクティブはデフォルトでは属性名として利用できるようになっていて、要素名やクラス名として指定する事も出来ます。
 
○属性名で指定
restrict: ‘A’(デフォルト)
例)
<div products-list=”products”>
 
○要素名で指定
restrict: ‘E’
例)
<products-list list-source=”products”>
この例では、”products”という値をlist-sourceという属性を使って渡しています。
 
○クラス名で指定したい場合
restrict: ‘C’
例)
<div class=”products-list: products”>
 
○要素名または属性名を指定したい場合
restrict: ‘AE’
 
5)template、templateUrl属性
 
・カスタムディレクティブ内に挿入するHTMLを指定する。
 
templateオプションはインラインでHTMLを記述し、templateUrlオプションは、外部ファイルのパスを指定し、ファイルに記述したHTMLをインクルードします。