2014/02/28

ssh proxy

windowでは同様で、.sshのしたで「~/.ssh/config」を修正する


# プロキシ環境
Host taro_px
User taro
HostName remote.co.jp
ProxyCommand connect -H proxy_server.jp:8080 %h %p
Identityfile ~/.ssh/id_rsa

# 自宅
Host taro_home
User taro
HostName remote.co.jp
Identityfile ~/.ssh/id_rsa

ssh taro_px
ssh taro home

linux cut

例:
somoWords=`hostname | cut -d'-' -f 2`
==>"-"でホスト名を分割して、2番目の物を取る


-b, --bytes byte-list     byte-listで指定した位置のバイトだけ表示する
-c, --characters character-list     character-listで指定した位置の文字だけ表示する
-d, --delimiter delim     フィールドの区切りを設定する。初期設定値はタブ
-f, --fields field-list     field-listで指定したフィールドだけ表示する
-s, --only-delimited     フィールドの区切りのない行を無視する
file     テキスト・ファイルを指定する

$ cat tel.lst
046-xxx-xxxx    Kazuhiro Fukuda    Man
03-yyyy-yyyy    Yuki Izumi    Women
03-zzzz-zzzz    Toru Tejima    Man

$ cut -c 14- tel.lst  ←14文字目以降を取り出す
Kazuhiro Fukuda Man
Yuki Izumi      Women
Toru Tejima     Man

$ cut -f 2 tel.lst    ←第2フィールドを取り出す
Kazuhiro Fukuda
Yuki Izumi
Toru Tejima

2014/02/13

linux cupInfo

/proc/cpuinfoの中身

# cat /proc/cpuinfo
processor       : 0 そのマシンに刺さっているプロセッサ(コア)の通し番号。最初が0番。
vendor_id       : GenuineIntel
cpu family      : 6
model           : 15
model name      : Intel(R) Core(TM)2 CPU          6400  @ 2.13GHz
stepping        : 6
cpu MHz         : 2133.675
cache size      : 2048 KB  意味不明、L1,L2,L3?
physical id     : 0 物理プロセッサID。この数値が同じプロセッサは、同じソケットに刺さっている
siblings        : 2 そのコアが乗っかっている物理プロセッサに、いくつのコアが同居しているか。1つの物理プロセッサに搭載されているコア数、兄弟?
core id         : 0 ?
cpu cores       : 2 ?
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 10
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc pni monitor ds_cpl vmx est tm2 cx16 xtpr lahf_lm
bogomips        : 4273.36

processor       : 1
vendor_id       : GenuineIntel
cpu family      : 6
model           : 15
model name      : Intel(R) Core(TM)2 CPU          6400  @ 2.13GHz
stepping        : 6
cpu MHz         : 2133.675
cache size      : 2048 KB
physical id     : 0
siblings        : 2
core id         : 1
cpu cores       : 2
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 10
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc pni monitor ds_cpl vmx est tm2 cx16 xtpr lahf_lm
bogomips        : 4267.00

=>整理すると、
32コアの場合、
physical id ーー>物理ソケット(0、1、2つの物理ソケットね)
cpu cores--> 1個の物理CPUにコアの数(8、物理的的に8個のコアあるね)
siblingsー>1個の物理CPUにコアのみた目の数、HT技術のせいで。「論理的に」
core idーー>cpu coresの番号、物理的なコア


=>HT技術?
1つのCPUを2つのCPUであるように動作するのがHTという技術です。
HT技術を搭載したCPUでは、2つのソフトから送られてきた命令を
同時に処理することができるので、その分ロスが少なくなります。

最も効率のよい場合には、2倍の性能になる計算ですが、
通常は20%程度の性能向上になるようですね。

最新のパソコンでは、実際にCPU(のコア)を2つ搭載したものが主流です。
更にHT技術を導入し、実質的に4個のCPUを搭載しているかの如く振る舞う
タイプの製品も出ています。

processor :系统中逻辑处理核的编号。对于单核处理器,则课认为是其CPU编号,对于多核处理器则可以是物理核、或者使用超线程技术虚拟的逻辑核
vendor_id :CPU制造商     
cpu family :CPU产品系列代号
model   :CPU属于其系列中的哪一代的代号
model name:CPU属于的名字及其编号、标称主频
stepping   :CPU属于制作更新版本
cpu MHz   :CPU的实际使用主频
cache size   :CPU二级缓存大小
physical id   :单个CPU的标号
siblings       :单个CPU逻辑物理核数
core id        :当前物理核在其所处CPU中的编号,这个编号不一定连续
cpu cores    :该逻辑核所处CPU的物理核数
apicid          :用来区分不同逻辑核的编号,系统中每个逻辑核的此编号必然不同,此编号不一定连续
fpu             :是否具有浮点运算单元(Floating Point Unit)
fpu_exception  :是否支持浮点计算异常
cpuid level   :执行cpuid指令前,eax寄存器中的值,根据不同的值cpuid指令会返回不同的内容
wp             :表明当前CPU是否在内核态支持对用户空间的写保护(Write Protection)
flags          :当前CPU支持的功能
bogomips   :在系统内核启动时粗略测算的CPU速度(Million Instructions Per Second)
clflush size  :每次刷新缓存的大小单位
cache_alignment :缓存地址对齐单位
address sizes     :可访问地址空间位数
power management :对能源管理的支持,有以下几个可选支持功能:
  ts:  temperature sensor
  fid:   frequency id control
  vid:  voltage id control
  ttp:  thermal trip
  tm:
  stc:
  100mhzsteps:
  hwpstate:

cache ping pong

请问其中用来填充的cache_line_align的作用是?
之前有学习到c语言中宏align是内存补齐的作用,那这个不就是cache line补齐?但是啥是cache line??为啥有这么一步?

1.首先,什么是cache line?

CPU处理指令时,由于“Locality of Reference”原因,需要决定哪些数据需要加载到CPU的缓存中,以及如何预加载。因为不同的处理器有不同的规范,导致这部分工作具有不确定性。在加载的过程中,涉及到一个非常关键的术语:cache line。
cache line是能被cache处理的内存chunks,chunk的大小即为cache line size,典型的大小为32,64及128 bytes. cache能处理的内存大小除以cache line size即为cache line。
了解了cache line,然后再熟悉一下cpu上cache的一些策略

2.cpu上cache的策略

cache entry (cache条目)
包含如下部分
1) cache line : 从主存一次copy的数据大小)
2) tag : 标记cache line对应的主存的地址
3) falg : 标记当前cache line是否invalid, 如果是数据cache, 还有是否dirty
cpu访问主存的规律
1) cpu从来都不直接访问主存, 都是通过cache间接访问主存
2) 每次需要访问主存时, 遍历一遍全部cache line, 查找主存的地址是否在某个cache line中.
3) 如果cache中没有找到, 则分配一个新的cache entry, 把主存的内存copy到cache line中, 再从cache line中读取.

cache中包含的cache entry条目有限, 所以, 必须有合适的cache淘汰策略
一般使用的是LRU策略.
将一些主存区域标记为non-cacheble, 可以提高cache命中率, 降低没用的cache

回写策略
cache中的数据更新后,需要回写到主存, 回写的时机有多种
1) 每次更新都回写. write-through cache
2) 更新后不回写,标记为dirty, 仅当cache entry被evict时才回写
3) 更新后, 把cache entry送如回写队列, 待队列收集到多个entry时批量回写.

cache一致性问题
有两种情况可能导致cache中的数据过期
1) DMA, 有其他设备直接更新主存的数据
2) SMP, 同一个cache line存在多个CPU各自的cache中. 其中一个CPU对其进行了更新.

3.为啥需要cache line 补齐呢?

让我们先看一个例子,
举例:
  1. // 如下代码在SMP环境下存在cache频繁刷新问题  
  2. double sum=0.0, sum_local[NUM_THREADS];  
  3. #pragma omp parallel num_threads(NUM_THREADS)  
  4. {  
  5.  int me = omp_get_thread_num();  
  6.  sum_local[me] = 0.0;  
  7.   
  8.  #pragma omp for  
  9.  for (i = 0; i < N; i++)  
  10.  sum_local[me] += x[i] * y[i];  
  11.   
  12.  #pragma omp atomic  
  13.  sum += sum_local[me];  
  14. }  
    因为sum_local数组是个全局变量, 多个线程都会访问, 并且, 各个线程访问的地方很接近, 会导致一个线程更新, 其他CPU的cache line失效.
    所以在尽量不要让更新频率非常高(例如,计数器)和经常访问的变量分布在同一个cache line中,以避免“cache ping-pong”,亦“false sharing”现象。
      OK,为啥需要补齐呢,上面的例子里面多个线程的访问会出现false sharing现象,如果服务器采用这样的,则服务器性能会严重影响,为了解决这个问题,最简单的办法是采用cache line 补齐的方法。

ps:在查找这个面 试题的时候,有意思的是我在淘宝核心系统团队博客上发现了对这个题目的解答,我觉得简答的不是很认真,他们是参考一篇外文文献《Avoiding and Identifying False Sharing Among Threads》,这篇文章主要解决在SMP环境下cache line被频繁刷新的的问题。所以只是简单的将大意翻译过来。
将复制过来:
在做多线程程序的时候,为了避免使用锁,我们通常会采用这样的数据结构:根 据线程的数目,安排一个数组, 每个线程一个项,互相不冲突. 从逻辑上看这样的设计无懈可击,但是实践的过程我们会发现这样并没有提高速度. 问题在于cpu的cache line. 我们在读主存的时候,数据同时被读到L1,L2中去,而且在L1中是以cache line(通常64)字节为单位的. 每个Core都有自己的L1,L2,所以每个线程在读取自己的项的时候, 也把别人的项读进去, 所以在更新的时候,为了保持数据的一致性, core之间cache要进行同步, 这个会导致严重的性能问题. 这就是所谓的False sharing问题, 有兴趣的同学可以wiki下.

解决方法很简单:
把每个项凑齐cache line的长度,实现隔离.
1
2
3
4
5
6
7
8
typedef union {
    erts_smp_rwmtx_t rwmtx;
    byte cache_line_align__[ERTS_ALC_CACHE_LINE_ALIGN_SIZE(
                sizeof(erts_smp_rwmtx_t))];
} erts_meta_main_tab_lock_t;
或者
_declspec (align(64)) int thread1_global_variable;
__declspec (align(64)) int thread2_global_variable;
这就是为什么在高性能服务器中到处看到cache_line_align, 号称是避免cache的trash.
类似valgrind和intel vtune的工具可以做这个层次的性能

2014/02/12

linux yum proxy リポジトリ

これも何も考えずに使っているが、

yum repolist all--->リポジトリの一覧が表示される。数など。。。
yum list installed--->yum経由でインストール済みの一覧


他にもいろいろある。
easy_install
pip
など、
自動的に[download --complie--install]をしているね。

ーーーーーーーーーーーーーー
例:ansibleのインストール:

# yum install python-devel python-setuptools
# easy_install pip
# pip install ansible
ーーーーーーーーーーーーーー


・yum proxy
#vi /etc/yum.conf
#proxy=http://proxy.hostname.com:5273/

・CentOSのyum 接続先指定:
# cd /etc/yum.repos.d
# vi CentOS-Base.repo


★CentOS6.5 64bitのyumリポジトリにEPELを追加
wget http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm
rpm -Uvh epel-release-6-8.noarch.rpm
れたEPELのリポジトリの設定ファイル「/etc/yum.repos.d/epel.repo」を以下のように編集します。

[epel]
:(略)
enabled=1
↓変更
enabled=0

yumコマンドの実行時にEPELのリポジトリを使用するには、以下のようにオプション「--enablerepo=epel」を付けて実行します

# yum --enablerepo=epel install freetds-devel

linux cron

何も考えずにcrontabを使っているが。。。


■cronサービス
/etc/rc.d/init.d/crond status

■cronの設定ファイル

cronの設定ファイルは、以下の表の通りです。crond は、毎分、以下の設定ファイルの内容に変更がないかを確認し、変更があった場合には、それを反映して実行します。

/var/spool/cron/user    全ユーザ    ユーザの自動タスク設定ファイル
===>このファイルの作成/編集は、 'crontab -e' とコマンドを実行して行ないます。

/etc/crontab    root    毎時、毎日、毎月、毎週の自動タスクのメイン設定ファイル
/etc/cron.hourly    root    毎時実行される自動タスク設定ファイルを置くディレクトリ
/etc/cron.daily    root    毎日実行される自動タスク設定ファイルを置くディレクトリ
/etc/cron.monthly    root    毎月実行される自動タスク設定ファイルを置くディレクトリ
/etc/cron.weekly    root    毎週実行される自動タスク設定ファイルを置くディレクトリ
/etc/cron.d    root    上記以外の自動タスク設定ファイルを置くディレクトリ

分    0~59
時    0~23
日    1~31
月    1~12 or jan~dec
曜日    0~7 [0,7は日曜日] or sun~sat
コマンド    有効なコマンドを記述します。空白を含むことも可能ですが、標準のBourne Shellの書式に従って記述します。


リスト     0,15,30,45     分フィールドで指定した場合、15分に一度処理を実行します。
範囲     1-5     曜日フィールドで指定した場合、月曜日~金曜日に処理を実行します。
共存     1,3,7-9     時間フィールドで指定した場合、1時、3時、7時、8時、9時に処理を実行します。
間隔値     1-5/2     時間フィールドで指定した場合、1時、3時、5時に処理を実行します。なお、間隔値は、「/」の後ろに指定した値の間隔で処理を実行します。


■「/etc/crontab」
通常、このファイルには、以下のように、「cron.monthly」、「cron.weekly」、「cron.daily」、「cron.hourly」配下のファイルが、指定時間ごとに実行されるように設定されています。


■アクセス制御
vi /etc/cron.allow


■ansibleでcron 削除
ansible ** -s -i hosts -m command -a "touch /tmp/mycron"
ansible ** -s -i hosts -m command -a "crontab /tmp/mycron"
ansible ** -s -i hosts -m command -a "rm /tmp/mycron"

2014/02/07

linux dd disk速度測定

linux dd ファイルの変換とコピーを行う

if=file     入力ファイルを指定する。指定がない場合は標準入力を表す
of=file     出力ファイルを指定する。指定がない場合は標準出力を表す
ibs=bytes     一度に指定したバイトのブロックを読み出す
obs=bytes     一度に指定したバイトのブロックを書き込む
bs=bytes     一度に指定したバイトのブロックを読み書きする
cbs=bytes     一度に指定したバイトのブロックを変換する
skip=blocks     入力ファイルの先頭から指定したブロックをスキップする
seek=blocks     出力ファイル中の指定したブロックをスキップする
count=blocks     入力ファイルから出力ファイルへ指定したブロックをコピーする
conv=code     コード変換を行する。指定できるコードは後述のコード表を参照


$dd bs=1M count=100 if=/dev/zero of=/home/ore/disktest oflag=direct(memoryのbuffer cacheを無効にする)
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.06987 seconds, 1.5 GB/s
ーーー>

/dev/zero は、Unix系オペレーティングシステムにおけるスペシャルファイルの1つで、全てヌルキャラクタ(ASCII の NUL、0x00)の内容を読み出すことができる。
典型的利用例として、何らかの情報を上書きするキャラクタストリームとして使う

ディスク スペック情報

・例:
interface:Serial ATA600
キャッシュ:
回転数:
平均シークタイム:
・Serial ATAーー>SATA
従来のATA仕様の後継仕様で、
Serial ATA 1.0 は 1.5Gbps--->150M/s
Serial ATA 300 は 3.5Gbps--->300M/s
Serial ATA 600 は 6.0Gbps--->600M/s

例:
interface:Ultra320
キャッシュ:
回転数:15000 rpm
平均シークタイム:
下記は並行なやつ
SCSI-->small computer system interface
SCSI2->
SCSI3->Ultra320


SASは全二重通信が可能なので、送信と受信を同時並行で実行できる。
パラレルSCSIやパラレル/シリアルATAは、送信と受信を定期的に切り替える半二重通信である。

Serial ATAの方が早いね。。

ディスクI/O

ディスクI/Oのボトルネックーー>ディスクI/O
CPUのボトルネックーー>CPUのクロック速度、CPUの奪い合う
ネットワークのボトルネックーー>ネットワークまたはストレージ回線の帯域幅
CPUとI/Oのバランスーー>圧縮技術を併用、インメモリ化・フラッシュディスク・SSDなどの利用により,ディスクI/Oレスポンスが高速化されても,同じようにバランスの変化が起きます。よかれと思って実施したチューニングが,思わぬ被害を生んでしまう可能性もあるのです。
ロックのボトルネックーー>規模データに多数のユーザが同時にアクセスした場合,メモリ上やディスク上にて,同一データまたは特定グループのデータに対するロックの競合が発生する

    I/Oレスポンス=I/O要求処理にかかる応答時間
        ==>一度に扱うデータ量が小さいシステムの場合,1データブロックのI/O時間を表すレスポンスを向上させることが重要になり
    I/Oスループット=単位時間当たりのI/O処理量
        ==>売上分析など,一度に対象となるデータが大きい(数GBなど)場合は,1データブロックの処理時間よりも,単位時間あたりにどれだけ多くのデータを読み書きできるかが重要になる
   
    ミクロなI/O性能を論じる場合 ⇒レスポンスを考える
    マクロなI/O性能を論じる場合 ⇒スループットを考える



    I/O時間 = ストレージがデータを取得する時間
            + ストレージからデータベースへデータを転送する時間
            + データベースサーバでI/O処理を行う時間


・索引,エクステント,ブロックが断片化している

2014/02/04

Linux viで文字コード

ShiftJIS で開く
$ vi -c ":e ++enc=cp932" index.html

EUCで開く
$ vi -c ":e ++enc=euc-jp" index.html

UTF8で開く
$ vi -c ":e ++enc=utf8" index.html