脳汁portal

アメリカ在住(だった)新米エンジニアがその日学んだIT知識を書き綴るブログ

各種proxy設定(環境変数, yum.conf, wgetrc)

各種proxyの設定方法です。

環境変数

bash
export http_proxy="${proxyURL}:${port}"
export https_proxy="${proxyURL}:${port}"
tcsh
setenv http_proxy ${proxyURL}:${port}
setenv https_proxy ${proxyURL}:${port}

yum

yum.confを作成・編集する

vi /etc/yum.conf
### 以下の1行編集
  proxy=${proxyURL}:${port}

wget

wgetrcを作成・編集する

vi /etc/wgetrc
### 以下の2行編集
http_proxy = ${proxyURL}:${port}
ftp_proxy = ${proxyURL}:${port}

I/O waitが発生する原理(dirtyメモリ、write back)

I/O waitにはdirtyメモリwrite back処理(pdflush)が深く関係しています。

書き込み処理

低負荷時

書き込み処理(見かけ上の書き込み処理)

dirtyフラグと一緒に随時メモリに書き込まれる(dirtyメモリ)

5秒に一度dirtyメモリを読み取って実際に物理ディスクに書き込む(write back処理=実際の書き込み処理)
  ⇒これがI/O 処理の開始である。

中程度負荷時

書き込み処理(見かけ上の書き込み処理)

dirtyフラグと一緒に随時メモリに書き込まれる(dirtyメモリ)

dirtyメモリがある一定サイズに達した時点で、(5秒待たずに)I/O処理を開始して実際に物理ディスクに書き込む(write back処理)

高負荷時/過負荷時

書き込み処理(見かけ上の書き込み処理)

dirtyフラグと一緒に随時メモリに書き込まれる(dirtyメモリ)

dirtyメモリがある一定サイズに達した時点で、(5秒待たずに)I/O処理を開始して実際に物理ディスクに書き込む(write back処理)

物理ディスクへの書き込み処理が完了する前に再び次のdirtyメモリが一定数に達してしまう

前のディスクへの書き込み処理が完了していないので、dirtyメモリが一定数になってもディスクへの書き込みが開始されず、前回のwrite back処理の終了を待たなければいけない
  ⇒これをI/Owaitという

各項目の設定値

これらのI/O waitに関する設定値はOSレベルで確認・変更することが出来る

vm.dirty_background_ratio

メモリ上のdirtyメモリが占める割合(%)。
この値を超えるとpdflushが呼び出され、write back処理がが行われる。
但し、このwrite back処理は優先度の低いバックグラウンドプロセスとして実行される。
デフォルト値は10%。単位は%

/sbin/sysctl vm.dirty_background_ratio
  # ==> vm.dirty_background_ratio = 10

vm.dirty_ratio

vm.dirty_backgroup_ratioとほぼ同じだが、この値を超えた場合は、write back処理が優先度の高いフォアグラウンドプロセスとして実行される
デフォルト値は20%。単位は%

/sbin/sysctl vm.dirty_ratio
  # ==> vm.dirty_ratio = 20

vm.dirty_expire_centisecs

メモリ上に存在しているdirtyメモリの存在時間。
この値を過ぎた場合にwrite back処理が実行される
デフォルト値は3000(30秒)単位は1/100秒

/sbin/sysctl vm.dirty_expire_centisecs
  # ==> vm.dirty_expire_centisecs = 3000

vm.dirty_writeback_centisecs

pdflushデーモンが起動する間隔。
この間隔でdirtyメモリのデータが物理ディスクに書き込まれる
デフォルト値は500(5秒)。単位は1/100秒

/sbin/sysctl vm.dirty_writeback_centisecs
  # ==> vm.dirty_writeback_centisecs = 500


パルスのファルシのルシがパージでコクーンなまとめ

書き込み処理はいったんメモリにdirtyメモリとして保存されて、vm.dirty_background_ratioの割合を超えるか、vm.dirty_expire_centisecsの時間が経過するとpdflushが実行されてwrite back処理によって物理ディスクに書き込まれるが、書き込み処理が終わる前に次のpdflushが実行されても、前回の書き込みが終了するまでは待たなければいけない。
これをI/O waitとITの民は言う。

要は順番待ちのことです。

screenで画面分割中に他の画面の内容をコピペする方法

方法

コピー

# screen コマンドの開始
Ctrl+a

# コピーモードの開始 
[

# 始点の決定
Space

# 終点の決定
Space

ペースト

# screen コマンドの開始
Ctrl+a

# ペースト
]

例えば以下のように二画面に分けて、それぞれでvimを開きます。
f:id:portaltan:20151015105705p:plain

ここで通常のyy等のvimのコピーコマンドを使っても、その結果は同じ画面でしか使えないので、左右の画面でコピペをすることはできません。
なので、上で書いた方法をつかいます。

vimの内容のコピペ

まずは左の画面で始点と終点を決めてコピーをします。
f:id:portaltan:20151015110005p:plain

次に右の画面でペーストをすると、左の画面でコピーをした内容がペーストされます
f:id:portaltan:20151015110214p:plain

shellの画面のコピペ

この機能はvimに限らず全ての画面で使用することができます。
f:id:portaltan:20151015110457p:plain

pingでport指定したい時

結論から言うとpingでは通常port指定が出来ないので「nping」コマンドを使いましょう。

ダウンロード

nmapと一緒にダウンロードされるので、nmapをinstallします

yum install nmap

コマンド

使用法

nping ${host} -p ${port}

成功した場合
nping 175.41.202.96 -p 3000

Starting Nping 0.5.51 ( http://nmap.org/nping ) at 2015-10-14 01:02 UTC
SENT (0.0178s) ICMP 10.184.30.164 > 175.41.202.96 Echo request (type=8/code=0) ttl=64 id=64344 iplen=28
・
・
・
RCVD (4.0249s) ICMP 175.41.202.96 > 10.184.30.164 Echo reply (type=0/code=0) ttl=44 id=19074 iplen=28

Max rtt: 4.060ms | Min rtt: 2.359ms | Avg rtt: 2.797ms
Raw packets sent: 5 (140B) | Rcvd: 5 (140B) | Lost: 0 (0.00%)
Tx time: 4.00481s | Tx bytes/s: 34.96 | Tx pkts/s: 1.25
Rx time: 5.00624s | Rx bytes/s: 27.97 | Rx pkts/s: 1.00
Nping done: 1 IP address pinged in 5.04 seconds

なぜpingにはport指定の方法がないか

pingは「ICMP(Internet Control Message Protocol)というちょっと変わったプロトコルを使用しています。
このICMPではport指定することが出来ません。
上のほうで「通常port指定出来ない」という書き方をしたのは、調べていたところsolarisではport指定が出来ていたようです。
古いOSなので載せませんが、調べれば出てくるので必要な人は参照してみてください。

ネットワークが繋がらないときに調査する8項目+α

クライアント側(接続元)での確認

ping

ping ${host}

Ex.)
ping 54.168.196.212
 ・
 ・
 ・
  6 packets transmitted, 6 received, 0% packet loss, time 5387ms <== ここが0% packet lossじゃない場合おかしい
  rtt min/avg/max/mdev = 0.432/0.471/0.533/0.041 ms

Check Point

  • そもそもサーバ自体へのアクセスが正常に出来ていない
  • pingはicmpというプロトコルを使っているのでicmpの制限がかかっていないかチェック
  • pingはport指定できない(Solarisのみ出来る?)ので、port指定したい場合は以下の「nping」コマンドを使う


nping

nping ${host} --tcp -p ${port}

Ex.)
#  nping 54.168.87.131 --tcp -p 3000
  Starting Nping 0.5.51 ( http://nmap.org/nping ) at 2015-10-09 05:39 UTC
  .
  .
  .
  Max rtt: 2.705ms | Min rtt: 2.363ms | Avg rtt: 2.494ms
  Raw packets sent: 3 (120B) | Rcvd: 3 (132B) | Lost: 0 (0.00%)   # ⇒Lostが 0 (0.00%)なことを確認
  Tx time: 2.34737s | Tx bytes/s: 51.12 | Tx pkts/s: 1.28
  Rx time: 2.34737s | Rx bytes/s: 56.23 | Rx pkts/s: 1.28
  Nping done: 1 IP address pinged in 2.36 seconds

Check Point

  • Lostが0 になっていることを確認


nmap

nmap ${host}

Ex.)
nmap 54.199.127.181
 
  Starting Nmap 5.51 ( http://nmap.org ) at 2015-10-09 05:29 UTC
  Nmap scan report for ********************
  Host is up (0.0025s latency).
  Not shown: 985 filtered ports
  PORT      STATE  SERVICE
  22/tcp    open   ssh
  23/tcp    closed telnet
  80/tcp    closed http
  3000/tcp  open   ppp
  10000/tcp closed snet-sensor-mgmt
  10001/tcp closed scp-config
  .
  .
  .

Check Point

  • 目的のportのSTATEがopenかどうか確認する


telnet

telnet ${host} ${port}

Ex.)
telnet 54.168.196.212 22
  Trying 54.168.196.212...
  Connected to 54.168.196.212.
  Escape character is '^]'.
  SSH-2.0-OpenSSH_5.3

CheckPoint

  • アクセス出来ないときは「Trying ${host}...」で止まったままになる


curl

curl ${url}

CheckPoint

  • 繋がらないけどこれだと繋がるってことが意外とある
  • その場合はブラウザのプロキシ設定なりFireWall設定を見直す


サーバ側(接続先)での確認

ss

ss -lnpt | grep ${対象port}

Ex.)
ss -lnpt | grep 3000
LISTEN     0      128                       *:3000                     *:*      users:(("ruby",1548,8

CheckPoint

  • port番号の前が*でなく特定のipだった場合は、そのipからのアクセスしか受け付けないという意味
  • railssinatraなどのrackアプリケーションでweblickを使う場合、ここがデフォルトでは127.0.0.1になっている場合があるので注意

[Ruby] sinatraがポート4567を指定しても繋がらない - 脳汁portal


iptables

iptables -L
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination

    Chain FORWARD (policy ACCEPT)
    target     prot opt source               destination

    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination

CheckPoint

  • policyがDROPになっている場合は記載されているルール以外の全てのアクセスをRejectするので注意
  • AWSデフォルトの「REJECT all -- anywhere anywhere reject-with icmp-host-prohibited」も結構悪さをする印象です

AWSでpingは通るのに実際に接続しようとすると「No route to host」って言われる原因 - 脳汁portal


netstat

netstat -antu
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:3000                0.0.0.0:*                   LISTEN
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN
tcp        0     96 10.123.29.206:22            133.237.7.83:61023          ESTABLISHED
tcp        0      0 :::22                       :::*                        LISTEN
tcp        0      0 ::1:25                      :::*                        LISTEN
udp        0      0 0.0.0.0:68

CheckPoint

  • 対象のportのStateがListenになっているか確認する


全部試してだめだったら

iptables 全停止して確認
/etc/rc.d/init.d/iptables stop
ブラウザのキャッシュや履歴を消去して確認
ブラウザのプライベートモードで確認
IEで確認
  • chromeやFFがダメでもIEなら繋がるということもあります
他のデバイスで確認
  • スマホとかで確認するとすんなり繋がるということも(ry
アクセス制限を確認
  • 会社とかの場合は会社側が大元でアクセス制限しているということもあります

AWSのvi(vim)のversionをupdateする方法

AWSに限らないが、vagrantのboxなどでプリインストールされているvi(vim)が古くて使いたい機能が使えない場合に最新のvimに入れ替える方法

手順

yum install vim
mv /bin/vi /bin/vi_bk
ln -s /usr/bin/vim /bin/vi

Historyコマンドに日時情報を追加する方法

LinuxのHistoryコマンドに日時データを追加する方法です。

方法

以下のコマンドをうてばOKです(bash)の場合

export HISTTIMEFORMAT='%y/%m/%d %H:%M:%S '

結果

何もしないと以下のようにコマンドしかわかりません。

$ history
.
.
.
1001  cd
1002  ls -la
1003  date
1004  cat /etc/issue
1005  history

上記コマンドをうつと日時データが取得できます

.
.
.
1001  15/09/28 12:41:22 cd
1002  15/09/28 12:41:24 ls -la
1003  15/09/28 12:41:27 date
1004  15/09/28 12:41:34 cat /etc/issue
1005  15/09/28 12:41:37 hitotry
1006  15/09/28 12:41:38 history
1007  15/09/28 12:43:00 export HISTTIMEFORMAT='%y/%m/%d %H:%M:%S '
1008  15/09/28 12:43:02 history

注意

このコマンドをうってからの情報しか取得できません。
shellを抜けても過去の情報はのこっていますが、それ以前の昔のデータなどはそもそも日時データが保存されていないので取得することができません。
なので、ログイン時に自動でこの環境変数をsetするようにしておくといいでしょう。

ログイン時に自動設定する方法

cd ~
vi .bash_profile
#末尾に以下を追加
    export HISTTIMEFORMAT='%y/%m/%d %H:%M:%S '