Hatena::ブログ(Diary)

ablog このページをアンテナに追加 RSSフィード Twitter

2014-10-19

VirtualBox 4.3.18 にアップデートしたメモ

VirtualBox を 4.3.16 から 4.3.18 にアップグレードした(ホストOSOracle Linux 6.4)。

VirtualBoxアップグレードする
# yum update VirtualBox-4.3

VirtualBox Extension Pack をインストールする

Guest Additions をインストールする
  • ゲストOSを起動する。
  • メニューから[Devices]-[Install Guest Additions...]を選択する。
  • インストーラがマウントされるので、マウントされたドライブを開いて、VboxWindowsAdditions.exe を右クリックして「管理者として実行する」を選択する。
  • ウイザードに従ってインストールする。
  • Choose Components で Direct3D Support は選択不要。
  • ゲストOS再起動する。

関連

2014-10-18

Oracle Database が Library cache と Dictionary cache に同じ情報を持つと聞いて

Oracle8I Internal Services for Waits, Latches, Locks, and Memory

Oracle8I Internal Services for Waits, Latches, Locks, and Memory

P.50

It also contains abstract representations in a form called DIANA of the database objects referenced by the SQL statements. The information is needed in this form for PL/SQL program unit compilation and SQL statement parsing and execution, despite the fact that dictionary cache contains the same information in a different from.

なるほどね。さすが、Steve Adams

PL/SQLプログラミング言語Adaをベースにしています。したがって、PL/SQLでは、ツリー構造中間言語Descriptive Intermediate Attributed Notation for Ada(DIANA)を使用しています。この中間言語は、インタフェース定義言語(IDL)と呼ばれるメタ表記を使用して定義されます。DIANAは、コンパイラなどのツールによって内部的に使用されます。

PL/SQLのプログラム上の制限

2014-10-13

iostat はどのように %util を算出しているか(3)

と続いた iostat から Linux Kernel のブロックレイヤーへの旅は

のおかげでほぼ終わりを迎えました。

part_round_stats() では、その延長で、全てのリクエストがキューにいた時間の積算値を表すtime_in_queue と、デバイスがIOリクエストを発行していた時間を表す io_ticks を更新しています。io_ticksには前回のリクエスト完了から、今回のリクエスト完了までを加算し、time_in_queueにはそれに実行中のリクエスト数を掛けたものを加算しているのがわかります。

tatic void part_round_stats_single(int cpu, struct hd_struct *part,
                    unsigned long now) 
{
    if (now == part->stamp)
        return;

    if (part_in_flight(part)) {
        __part_stat_add(cpu, part, time_in_queue,
                part_in_flight(part) * (now - part->stamp));
        __part_stat_add(cpu, part, io_ticks, (now - part->stamp));
    }    
    part->stamp = now; 
}
Etsukata blog: iostat -x の出力を Linux Kernel ソースコードから理解する

プロセスアカウンティングのように定期的に割込み(tick)を入れて加算していくのではなく、I/Oのたびにデバイスごとに存在する構造体(hd_struct)に加算していっているというイメージで合っていそう(想定通り)。「io_ticksには前回のリクエスト完了から、今回のリクエスト完了までを加算」すると、サービスタイム(io_ticks)にデバイスI/O処理中の時間以外も加算されてしまいそうな気がするが、ちょっと調べてみた限りではよくわからなかったので、今後の課題にしよう。この記事、よく見ると1年前に書かれたもの。なんでもっと早く見つけられなかったんだろう。。。

%utilではなくサービスタイム(svctm)の話しになっていますが、

%util = svctm(インターバル期間中のsvctmの合計) / インターバル(iostat -x 5 とした場合、インターバルは5秒)

なので、サービスタイムがわかれば、%util がわかるわけです。

SystemTap で block/blk-core.c#part_round_stats_single にバックトレースを仕掛けてみた(さくらVPSでやりました)。

#!/usr/bin/stap -v
probe kernel.function("part_round_stats_single"){
        printf("%s[%d]\n",execname(),pid())
        print_backtrace()
}

こんな感じ。

# uname -r
2.6.32-358.18.1.el6.x86_64
# ./part_round_stats_single.stp
Pass 1: parsed user script and 86 library script(s) using 195560virt/24276res/3064shr/21488data kb, in 140usr/20sys/159real ms.
Pass 2: analyzed script: 2 probe(s), 3 function(s), 2 embed(s), 0 global(s) using 350432virt/49524res/4128shr/45660data kb, in 520usr/170sys/687real ms.
Pass 3: using cached /root/.systemtap/cache/24/stap_24b4e258281281b492ad5030573ce095_2415.c
Pass 4: using cached /root/.systemtap/cache/24/stap_24b4e258281281b492ad5030573ce095_2415.ko
Pass 5: starting run.
WARNING: Missing unwind data for module, rerun with 'stap -d jbd2'
WARNING: Missing unwind data for module, rerun with 'stap -d virtio_blk'
jbd2/vda3-8[363]
 0xffffffff81256eec : part_round_stats+0x2c/0x110 [kernel]
 0xffffffff8125acee : drive_stat_acct+0xee/0x130 [kernel]
 0xffffffff8125ea50 : blk_queue_bio+0x110/0x5d0 [kernel]
 0xffffffff8125d09e : generic_make_request+0x24e/0x500 [kernel]
 0xffffffff8125d3dd : submit_bio+0x8d/0x120 [kernel]
 0xffffffff811b4f56 : submit_bh+0xf6/0x150 [kernel]
 0xffffffffa007ec08 [jbd2]
 0xffffffff810096f0 : __switch_to+0xd0/0x320 [kernel] (inexact)
 0xffffffff81081b5b : try_to_del_timer_sync+0x7b/0xe0 [kernel] (inexact)
 0xffffffffa0085148 [jbd2] (inexact)
 0xffffffff81096da0 : autoremove_wake_function+0x0/0x40 [kernel] (inexact)
 0xffffffffa0085090 [jbd2] (inexact)
 0xffffffff81096a36 : kthread+0x96/0xa0 [kernel] (inexact)
 0xffffffff8100c0ca : child_rip+0xa/0x20 [kernel] (inexact)
 0xffffffff810969a0 : kthread+0x0/0xa0 [kernel] (inexact)
 0xffffffff8100c0c0 : child_rip+0x0/0x20 [kernel] (inexact)
(中略)
swapper[0]
 0xffffffff81256eec : part_round_stats+0x2c/0x110 [kernel]
 0xffffffff8125dd4a : blk_finish_request+0x18a/0x260 [kernel]
 0xffffffff8125de6b : __blk_end_request_all+0x4b/0x60 [kernel]
 0xffffffffa005822a [virtio_blk]
swapper[0]
 0xffffffff81256f58 : part_round_stats+0x98/0x110 [kernel]
 0xffffffff8125dd4a : blk_finish_request+0x18a/0x260 [kernel]
 0xffffffff8125de6b : __blk_end_request_all+0x4b/0x60 [kernel]
 0xffffffffa005822a [virtio_blk]
swapper[0]
 0xffffffff81256eec : part_round_stats+0x2c/0x110 [kernel]
 0xffffffff8125dd4a : blk_finish_request+0x18a/0x260 [kernel]
 0xffffffff8125de6b : __blk_end_request_all+0x4b/0x60 [kernel]
 0xffffffffa005822a [virtio_blk]
swapper[0]
 0xffffffff81256f58 : part_round_stats+0x98/0x110 [kernel]
 0xffffffff8125dd4a : blk_finish_request+0x18a/0x260 [kernel]
 0xffffffff8125de6b : __blk_end_request_all+0x4b/0x60 [kernel]
 0xffffffffa005822a [virtio_blk]

参考

図 14-3

f:id:yohei-a:20141013114448j:image

Systems Performance: Enterprise and the Cloud

Systems Performance: Enterprise and the Cloud

P.436

The most important metric for delivered performance is await. If the application and file system use a technique to mitigate write latency (e.g., write-through), w_await may not matter as much, and you can focus on r_await instead.

For resource usage and capacity planning, %util is important, but bear in mind it is only a measure of busyness (non-idle time) and may mean little for virtual devices backed by multiple disks. Those devices may be better understood by the load applied: IOPS (r/s + w/s) and throughput (rkB/s + wkB/s).

The r_await and w_await columns are newer additions to the iostat(1) tool; previous versions had just await. The iostat(1) man page warns that the svctm field will be removed in future versions as the metric is considered to be inaccurate. (I don’t think it is inaccurate, but I do think it may have misled people, since it is an inferred value and not a measurement of device latency.)


追記(2014/10/17):

@ さんのブログエントリが以下の通り修正されていました。ありがとうございます!これで謎も解けた。

io_ticksには前回のリクエスト完了から、今回のリクエスト完了までを加算し、訂正(@yohei-aさんのエントリ:「iostat はどのように %util を算出しているか(3)」を読んで間違いに気づきました。ありがとうございます!) io_ticksにはIO 発行中の時間(part_in_flightが0より大きい時間)を加算し、time_in_queueにはそれに実行中のリクエスト数を掛けたものを加算しているのがわかります。

Etsukata blog: iostat -x の出力を Linux Kernel ソースコードから理解する

2014-10-07

LinuxでCPU使用率を上げるコマンド

いいものを見つけたのでコピペ

yes >> /dev/null &

最後に & お勧め w(二つターミナルが必要でなくなる。)

ちなみに メモリ負荷をあげる魔法のコマンド

/dev/null < $(yes) & 
LinuxでCPU負荷を上げる魔法のコマンド - Qiita

">>" は ">" でも良いと思うが、何か特別な理由があって">>"にしているのだろうか。


追記(2014/10/08):

ただのメモにはてブがたくさん(当社比)ついてビックリ(^-^;

コア数に対する考慮が足りない。

コア数に対する考慮が足りない。 - gomakyu のコメント / はてなブックマーク

とコメントを頂いた通り、上記のコマンドを実行しても1つの論理CPUを使い切るだけです。

f:id:yohei-a:20141008210643p:image

例えば上の図の通り、1ソケット * 4コア * 2スレッド で論理CPU数が8の場合は、ざっくり、1多重で実行すると12.5%、4多重で実行すると50%、8多重で実行すると100%になります。

JPOUGのイベントで「私がPerlを使う理由」というお題でLTしました - ablog で4つ論理CPUの場合に Perl ワンライナーCPU使用率を100%にする例を書いていますが、上記コマンドだと、4つの論理CPUの場合、

$ yes >> /dev/null &
$ yes >> /dev/null &
$ yes >> /dev/null &
$ yes >> /dev/null &

と4多重で実行すると100%になります。


$ yes | xargs -L 1 -P 8 >> /dev/null # マルチコアCPU LOAD は高くなった (死ねそうなのでバックグラウンドジョブにはしていない)

$ yes | xargs -L 1 -P 8 >> /dev/null # マルチコアの CPU LOAD は高くなった (死ねそうなのでバックグラウンドジョブにはしていない) - ymkjp のコメント / はてなブックマーク

とコメント頂きました。xargs の -P オプションで並列実行するとお洒落ですね*1。コメントの例は -P 8 なので8多重で実行することになります。


逆に性能分析の際は、システム全体ではCPU使用率は低くても、mpstat*2 などでCPU別に見ると1CPUは100%で張り付いていることがあります。

f:id:yohei-a:20141008212301p:image


それだとマルチコア使わんのじゃない? OpenSSL が楽という覚えが…ああこれこれ http://d.hatena.ne.jp/tmatsuu/20140101/1388586426

それだとマルチコア使わんのじゃない? OpenSSL が楽という覚えが…ああこれこれ http://d.hatena.ne.jp/tmatsuu/20140101/1388586426 - Nyoho のコメント / はてなブックマーク

こちらのコメントで紹介されている id:tmatsuu さんのMac Pro(Late 2013)を火鉢に見立てて暖を取る方法 - Dマイナー志向で紹介されている "openssl speed -multi X" 便利ですね。

$ openssl speed -multi 4

と実行してみると、

f:id:yohei-a:20141008213811p:image

こんな感じ。

CPU数に合わせて、100%使い切るには

openssl speed -multi `grep processor /proc/cpuinfo|wc -l`

としてやれば良いです。


最後に書籍紹介。

Systems Performance: Enterprise and the Cloud

Systems Performance: Enterprise and the Cloud

性能分析に興味のある方は小田さんたちの「絵で見てわかるシステムパフォーマンスの仕組み」や Brendan GreggSystems Performance: Enterprise and the Cloud がオススメです。

「絵で見てわかるシステムパフォーマンスの仕組み」はオラクル小田さんの根本原理の説明から始まり、現場で性能試験をどうすればよいか?(オラクル榑松さん)、仮想化の場合は?(VMware岡田さん)、クラウドでは?(AWS平山さん)という秀逸な構成になっていて、根本原理を理解でき、さらに現場で直面する問題(性能試験どうすれば良い?仮想化、クラウドでは?)についても書かれていて、現場に置いておきたい1冊だと思います。

"Systems Performance: Enterprise and the Cloud"は元同僚で絵で見てわかるITインフラの仕組みを共著した@に教えてもらった神本です。著者のwikipedia:Brendan GreggSun Microsystems の performance lead and kernel engineer で ZFS L2ARC の開発者でもあり、その後、 Oracle Corporation、Joyent を経て今は Netflix の Senior Performance Architect です。ハードウェアから UNIXSolarisLinuxカーネル、パフォーマンスまで深く幅広い知識を持ち、USE Method などシンプルでわかりやすいパフォーマンス分析手法を提唱しています。


関連


おまけ

「メモリ負荷をあげる魔法のコマンド」についても試してみたところ、メモリ使用量が増えました。変数 $(yes) がもりもり成長して、/dev/null にリダイレクトされないんでしょうね。

f:id:yohei-a:20141010014910p:image:w640

f:id:yohei-a:20141010014903p:image

strace してみると、

$ strace /dev/null < $(pwd)
execve("/dev/null", ["/dev/null"], [/* 53 vars */]) = -1 EACCES (Permission denied)
dup(2)                                  = 3
fcntl(3, F_GETFL)                       = 0x8002 (flags O_RDWR|O_LARGEFILE)
fstat(3, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 4), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe2339e1000
lseek(3, 0, SEEK_CUR)                   = -1 ESPIPE (Illegal seek)
write(3, "strace: exec: Permission denied\n", 32strace: exec: Permission denied
) = 32
close(3)                                = 0
munmap(0x7fe2339e1000, 4096)            = 0
exit_group(1)                           = ?
$ strace /dev/null < $(yes)
zsh: fatal error: out of heap memory

そのようですね。

*1Perl ワンライナーで遊んだメモ - ablog以来使っていなかった。

*2:top見ればすぐわかりますが

2014-10-06

vmstat の sys は soft や irq も含む

Linux で mpstat だとカーネルモードで使用されたCPU使用率は sys、soft(ソフトウェア割込み)、irq(ハードウェア割込み) が別々に表示される。vmstat は sy だけなので、たぶん soft と irq も含まれるんだろうと思っていた。vmstat のソースを見るとやはり、sys + soft + irq の合計を sy として表示しているみたい。

f:id:yohei-a:20141006180855p:image

上が vmstat で下が mpstat。


static void new_format(void) {
  const char format[]="%2u %2u %6lu %6lu %6lu %6lu %4u %4u %5u %5u %4u %4u %2u %2u %2u %2u\n";
  unsigned int tog=0; /* toggle switch for cleaner code */
  unsigned int i;
  unsigned int hz = Hertz;
  unsigned int running,blocked,dummy_1,dummy_2;
  jiff cpu_use[2], cpu_nic[2], cpu_sys[2], cpu_idl[2], cpu_iow[2], cpu_xxx[2], cpu_yyy[2], cpu_zzz[2];
  jiff duse, dsys, didl, diow, dstl, Div, divo2;
  unsigned long pgpgin[2], pgpgout[2], pswpin[2], pswpout[2];
  unsigned int intr[2], ctxt[2];
  unsigned int sleep_half; 
  unsigned long kb_per_page = sysconf(_SC_PAGESIZE) / 1024ul;
  int debt = 0;  // handle idle ticks running backwards

  sleep_half=(sleep_time/2);
  new_header();
  meminfo();

  getstat(cpu_use,cpu_nic,cpu_sys,cpu_idl,cpu_iow,cpu_xxx,cpu_yyy,cpu_zzz,
	  pgpgin,pgpgout,pswpin,pswpout,
	  intr,ctxt,
	  &running,&blocked,
	  &dummy_1, &dummy_2);

  duse= *cpu_use + *cpu_nic; 
  dsys= *cpu_sys + *cpu_xxx + *cpu_yyy; ★ココ
  didl= *cpu_idl;
  diow= *cpu_iow;
  dstl= *cpu_zzz;
  Div= duse+dsys+didl+diow+dstl;
  divo2= Div/2UL;
  printf(format,
	 running, blocked,
	 unitConvert(kb_swap_used), unitConvert(kb_main_free),
	 unitConvert(a_option?kb_inactive:kb_main_buffers),
	 unitConvert(a_option?kb_active:kb_main_cached),
	 (unsigned)( (*pswpin  * unitConvert(kb_per_page) * hz + divo2) / Div ),
	 (unsigned)( (*pswpout * unitConvert(kb_per_page) * hz + divo2) / Div ),
	 (unsigned)( (*pgpgin                * hz + divo2) / Div ),
	 (unsigned)( (*pgpgout               * hz + divo2) / Div ),
	 (unsigned)( (*intr                  * hz + divo2) / Div ),
	 (unsigned)( (*ctxt                  * hz + divo2) / Div ),
	 (unsigned)( (100*duse                    + divo2) / Div ),
	 (unsigned)( (100*dsys                    + divo2) / Div ),
	 (unsigned)( (100*didl                    + divo2) / Div ),
	 (unsigned)( (100*diow                    + divo2) / Div ) /* ,
	 (unsigned)( (100*dstl                    + divo2) / Div ) */
  );

vmstat は /proc/stat や /proc/vmstat を参照している。/proc/vmstat はメモリ関連の情報で、CPU使用率に関しては /proc/stat から取得しているはず。

$ strace -e open vmstat            
open("/etc/ld.so.cache", O_RDONLY)      = 3
open("/lib64/libproc-3.2.8.so", O_RDONLY) = 3
open("/lib64/libc.so.6", O_RDONLY)      = 3
open("/sys/devices/system/cpu/online", O_RDONLY|O_CLOEXEC) = 3
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
open("/proc/meminfo", O_RDONLY)         = 3
open("/proc/stat", O_RDONLY)            = 4 ★
open("/proc/vmstat", O_RDONLY)          = 50  0      0 6821880  90060 3629228    0    0   220    55  350 2657 10 28 62  0  0	

proc の man を見ると、Linux 2.6 から /proc/stat に iowait、irq、softirq 列が追加されたと書かれている。

$ man proc
/proc/stat
       kernel/system statistics.  Varies with architecture.  Common entries include:

cpu  3357 0 4313 1362393
The  amount of time, measured in units of USER_HZ (1/100ths of a second on most architectures, use sysconf(_SC_CLK_TCK) to obtain the right value), that the system spent in user mode, user mode with low priority (nice), system mode, and the idle task, respec-tively.  The last value should be USER_HZ times the second entry in the uptime pseudo-file.In  Linux  2.6  this line includes three additional columns: iowait - time waiting for I/O to complete (since 2.5.41); irq - time servicing interrupts (since 2.6.0-test4); softirq - time servicing softirqs (since 2.6.0-test4).

関連


追記(2014/10/07):

vmstat のソースを見ていて知らないオプションがいっぱいあることに気づいた(ソース見なくてもmanに書いてるんだけどw)。

$ vmstat -t
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ ---timestamp---
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 6704388 239748 3797564    0    0   158    51 1634 1506 15 49 36  0  0	2014-10-07 05:54:28 JST
  • active/inactive メモリを表示する(-a) … 2.5.41 kernel 以降
$ vmstat -a 
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free  inact active   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 6713308 3491976 1247468    0    0   155    50 1629 1523 15 48 37  0  0	
  • slab情報を表示する(-m)
$ vmstat -m
Cache                       Num  Total   Size  Pages
nf_conntrack_ffff8801f273d540      0      0    304     13
nf_conntrack_ffff8801f2601540      0      0    304     13
pid_3                         2     20    192     20
pid_2                        32     60    128     30
fuse_request                  0      0    608      6
fuse_inode                    0      0    768      5
bridge_fdb_cache              0      0     64     59
以下略)
  • ヘッダを最初の1回だけ表示する(-n)
$ vmstat -n 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 6743848 241216 3798400    0    0   146    48 1612 1567 14 46 40  0  0	
 0  0      0 6735156 241216 3807348    0    0     0     0 4722 8343  3  8 89  0  0	
  • ディスク統計を表示する(-d) … 2.5.70以降
$ vmstat -d               
disk- ------------reads------------ ------------writes----------- -----IO------
       total merged sectors      ms  total merged sectors      ms    cur    sec
(中略)
sda   136520    942 7201465   39103 176310   6609 2387666  156767      0     51
dm-0  136636      0 7194476  122411 182914      0 2387648 1200311      0     77
dm-1   36489      0 1350978   68501  77956      0  666896   85420      0     24
dm-2     324      0    2592     495      0      0       0       0      0      0
dm-3   99719      0 5840074   53613  91486      0 1720752 1115300      0     53
$ vmstat -p /dev/sda2  
sda2          reads   read sectors  writes    requested writes
              135779    7196329     165870    2463464
  • ワイド表示(-w)
$ vmstat -w 
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          0    6809616     242080    3800744    0    0   139    46 1594 1601  13 44  42  0  0
  • KB や MB 表示にする(-S k,K,m,M)
$ vmstat -S M
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0   6639    236   3709    0    0   134    45 1583   20 13 43 44  0  0	
  • ちなみにバージョンは 3.2.8 です
$ vmstat -V  
procps version 3.2.8