Hatena::ブログ(Diary)

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

2015-07-06

perf + Flame Graphs で Linux カーネル内のボトルネックを特定する

Linuxddで1GBのファイルを作成し perfプロファイリングし、Flame Graph (炎のグラフ?)にして可視化したものです。

Flame Graphs は perf(Linux)、SystemTap(Linux)、DTrace(SolarisOracle Linux(UEK)、Mac OS XFreeBSD)、XPerf.exe(Windows) などでのプロファイリング結果を可視化して最も使われているコードパスを早く正確に特定することができます。実体はプロファイリング結果をグラフ(SVG)に変換する Perl スクリプトです。

下から上に行くほどコールスタックが深く、左から関数名のアルファベット順でソートされています。一番上で横幅が広い関数CPUを長く使っています。今回は "_aesni_enc1" つまり暗号化がボトルネックになっていることがわかります。

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

  • システム全体の情報を取得してグラフにしているので、dd 以外にLinuxカーネルスレッド(kworker)などが見えます。
  • dd で書込みしているが、カーネルスレッド(kworker)で暗号化してそうで "_aesni_enc1" で最もCPUを使っていることがわかります。
  • 合計して上位を見つけるアプローチのため、瞬間的なスパイクを見つけるのには向いていません。

Flame Graphs の作者の Brendan Gregg は Sun、Oracle、Joyent でカーネル、パフォーマンスのエンジニアとして活躍し、現在は Netflix(北米インターネットトラフィックの32.3%を占める。YouTubeは17.1%)*1シニア・パフォーマンス・アーキテクトです。ZFS L2ARC や DTrace Toolkit の開発者で、Solaris Performance and ToolsDTrace: Dynamic Tracing in Oracle Solaris, Mac OS X and FreeBSD の著者で、LinuxConFreeBSD SummitOaktable WorldAWS re:Invent などのイベントで幅広く活動されています。是非 Brendan Gregg’s Homepage をご覧ください。

f:id:yohei-a:20141115140355p:image:w360


Flame Graphs の見方

P.35

  • 関数名で左から右にソートされています。
  • コールスタックは上に行くほど深くなります。

f:id:yohei-a:20150707035438p:image:w360

P.40

  • 1番上(d()、f()、h())がCPUを使っている関数で、横幅が長いほど長時間CPUを使っています。
  • 下の例ではf()が最もCPU時間を使っている関数です。

f:id:yohei-a:20150707035437p:image:w360


手順

$ wget https://raw.githubusercontent.com/brendangregg/FlameGraph/master/stackcollapse-perf.pl
$ wget https://raw.githubusercontent.com/brendangregg/FlameGraph/master/flamegraph.pl
  • root 以外でも perf を使えるようにする
# echo 0 > /proc/sys/kernel/perf_event_paranoid
# cat /proc/sys/kernel/perf_event_paranoid
0
$ perf record -a -g -F100000 dd if=/dev/zero of=/tmp/test.dat bs=1024K count=1000
  • perf で取得したデータをテキストに変換する。
$ perf script> perf_data.txt
$ perl stackcollapse-perf.pl perf_data.txt|perl flamegraph.pl --title "Flame Graphs - dd if=/dev/zero of=/tmp/test.dat bs=1024K count=1000" > flamegraph_dd.svg

環境

$ cat /etc/issue
Oracle Linux Server release 6.6
Kernel \r on an \m
$ uname -r
2.6.39-400.17.1.el6uek.x86_64

参考

Flame Graphs
Systems Performance: Enterprise and the Cloud

Systems Performance: Enterprise and the Cloud

Perf

関連


追記(2015/07/07):

いつもperfの結果は"perf report"するだけだったわ……。/"/proc/sys/kernel/kptr_restrict"に"0"を書き込むと警告とunknownが消えるはず。

いつもperfの結果は"perf report"するだけだったわ……。/"/proc/sys/kernel/kptr_restrict"に"0"を書き込むと警告とunknownが消えるはず。 - richard_raw のコメント / はてなブックマーク

本検証結果は /proc/sys/kernel/kptr_restrict = 0 (デフォルト)で実行した結果です。

$ cat /proc/sys/kernel/kptr_restrict
0

カーネルのコールスタックが [unknown] で /proc/sys/kernel/kptr_restrict が 0 以外の時は 0 にすることでカーネルのコールスタックが表示されると思いますが、上記検証で [unknown] になっているのはユーザープロセスのコールスタックなので、関係ないと思われます。/proc/sys/kernel/kptr_restrict が 0 以外だと /proc からカーネルポインタが参照できなくなるようです。

Add the %pK printk format specifier and the /proc/sys/kernel/kptr_restrict sysctl.

The %pK format specifier is designed to hide exposed kernel pointers,specifically via /proc interfaces. Exposing these pointers provides an easy target for kernel write vulnerabilities, since they reveal the locations of writable structures containing easily triggerable function pointers. The behavior of %pK depends on the kptr_restrict sysctl.

If kptr_restrict is set to 0, no deviation from the standard %p behavior occurs. If kptr_restrict is set to 1, if the current user (intended to be a reader via seq_printf(), etc.) does not have CAP_SYSLOG (which is currently in the LSM tree), kernel pointers using %pK are printed as 0's. If kptr_restrict is set to 2, kernel pointers using %pK are printed as 0's regardless of privileges. Replacing with 0's was chosen over the default "(null)", which cannot be parsed by userland %p, which expects "(nil)".

kptr_restrict for hiding kernel pointers [LWN.net]

CAP_SYSLOG (since Linux 2.6.37)

  • Perform privileged syslog(2) operations. See syslog(2) for information on which operations require privilege.
  • View kernel addresses exposed via /proc and other interfaces when /proc/sys/kernel/kptr_restrict has the value 1. (See the discussion of the kptr_restrict in proc(5).)
capabilities(7) - Linux manual page

/proc/sys/kernel/kptr_restrict (since Linux 2.6.38)

The value in this file determines whether kernel addresses are exposed via /proc files and other interfaces. A value of 0 in this file imposes no restrictions. If the value is 1, kernel pointers printed using the %pK format specifier will be replaced with zeros unless the user has the CAP_SYSLOG capability. If the value is 2, kernel pointers printed using the %pK format specifier will be replaced with zeros regardless of the user's capabilities. The initial default value for this file was 1, but the default was changed to 0 in Linux 2.6.39. Since Linux 3.4, only users with the CAP_SYS_ADMIN capability can change the value in this file.

proc(5) - Linux manual page

This post is already over a year old, but since it came out at the top of my Google search results when I had the same problem, I thought I'd answer it here. After some more searching around, I found the answer given in this related StackOverflow question very helpful. On my Ubuntu Raring system, I then ended up doing the following:

1. Compile my C++ sources with -g (fairly obvious, you need debug symbols)

2. Run perf as

record -g dwarf -F 97 /path/to/my/program

This way perf is able to handle the DWARF 2 debug format, which is the standard format gcc uses on Linux. The -F 97 parameter reduces the sampling rate to 97 Hz. The default sampling rate was apparently too large for my system and resulted in messages like this:

Warning:
Processed 172390 events and lost 126 chunks!

Check IO/CPU overload!

and the perf report call afterwards would fail with a segmentation fault. With the reduced sampling rate everything worked out fine.

3. Once the perf.data file has been generated without any errors in the previous step, you can run perf report etc. I personally like the FlameGraph tools to generate SVG visualizations.

4. Other people reported that running

echo 0 > /proc/sys/kernel/kptr_restrict

as root can help as well, if kernel symbols are required.

linux - How can I get perf to find symbols in my program - Stack Overflow

direct path read か db file scattered read か

Serial direct path reads were first introduced in Oracle 11G which were noticed by many customers (in both positive and negative ways) who upgraded from the earlier releases. Back then I did a quick write up on the subject to try and tackle some of the key variables which affect the behavior.

To recap, the following were observed for 11G:

  • Serial direct path reads start at _small_table_threshold*5.
  • Serial direct path reads stop when 50% of the table blocks are cached.
  • Serial direct path reads stop when 25% of the table blocks are dirty.

Since then, many people noticed that 11GR2 seems to be more aggressive on the thresholds so I decided to re-run the tests and see what changed. I'm also going to run the same tests on the Exadata to see whether it changes anything compared to a normal 11GR2 database.

Alex Fatkulin’s Blog: Serial direct path reads in 11GR2 and Exadata environments

Starting from Oracle 11.2.0.2, things have changed a little. Instead of making the direct path read decision based on the actual segment block count extracted from the segment header, Oracle actually takes this number from TAB$.BLKCNT (dba_tables.blocks) or TABPART$.BLKCNT, IND$.LEAFCNT etc.

Optimizer statistics-driven direct path read decision for full table scans (_direct_read_decision_statistics_driven) | Tanel Poder's Performance & Troubleshooting blog

2015-07-05

実行計画の OPERATION と OPTION は X$XPLTON と X$XPLTOO に

実行計画の OPERATION ってどこのX$表に入っているんだろうと思って調べたら、tech.E2SN に書かれていた。

  • X$XPLTON (eXPLain rowsource Operator Names) (11.1 -)
  • X$XPLTOO (eXPLain rowsource Operator Options) (11.1 -)
  • DBA_HIST_PLAN_OPERATION_NAME (11.2 -)
  • DBA_HIST_PLAN_OPTION_NAME (11.2 -)

続きを読む

実行計画が変動したSQLの実行計画を一括出力する

DBA_HIST_SQL_PLAN に PLAN_HASH_VALUE が複数ある SQL の実行計画を DBMS_XPLAN.DISPLAY_AWR で一括出力する SQL再帰SQLが出力されないよう OBJECT_OWNER で絞っている。

set pagesize 50000
set linesize 200

select b.* from
	( select distinct sql_id from
		( select p.sql_id,
			count(distinct p.plan_hash_value)
				over(partition by p.sql_id) as cnt
			from dba_hist_sql_plan p
				where p.object_owner = 'SCOTT'
		) where cnt > 1
	) a,
	table(dbms_xplan.display_awr(a.sql_id, null, null, 'ALL')) b
/
  • 出力結果例
PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------------
SQL_ID 2z5kjv7k63rdv
--------------------
/* SQL Analyze(35,1) */ SELECT A.*   FROM TEST_TABLE_A A      , TBL_B B
 WHERE A.P_NO2  = B.P_NO    AND A.P_CHAR = B.P_CHAR    AND
TO_CHAR(B.P_DATE, 'YYYYMMDD') = '20120801'

Plan hash value: 1824609195

------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name            | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                 |       |       | 30938 (100)|          |
|   1 |  NESTED LOOPS                |                 | 30012 |   967K| 30938   (1)| 00:06:12 |
|   2 |   NESTED LOOPS               |                 | 30300 |   967K| 30938   (1)| 00:06:12 |
|   3 |    TABLE ACCESS FULL         | TBL_B           |   300 |  3900 |    24   (5)| 00:00:01 |
|   4 |    INDEX RANGE SCAN          | TEST_TABLE_A_I1 |   101 |       |     2   (0)| 00:00:01 |
|   5 |   TABLE ACCESS BY INDEX ROWID| TEST_TABLE_A    |   100 |  2000 |   103   (0)| 00:00:02 |
------------------------------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

   1 - SEL$1
   3 - SEL$1 / B@SEL$1
   4 - SEL$1 / A@SEL$1
   5 - SEL$1 / A@SEL$1

SQL_ID 2z5kjv7k63rdv
--------------------
/* SQL Analyze(35,1) */ SELECT A.*   FROM TEST_TABLE_A A      , TBL_B B
 WHERE A.P_NO2  = B.P_NO    AND A.P_CHAR = B.P_CHAR    AND
TO_CHAR(B.P_DATE, 'YYYYMMDD') = '20120801'

Plan hash value: 2581240648

-----------------------------------------------------------------------------------------------
| Id  | Operation                   | Name            | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                 |       |       | 30938 (100)|          |
|   1 |  TABLE ACCESS BY INDEX ROWID| TEST_TABLE_A    |   100 |  2000 |   103   (0)| 00:00:02 |
|   2 |   NESTED LOOPS              |                 | 30012 |   967K| 30938   (1)| 00:06:12 |
|   3 |    TABLE ACCESS FULL        | TBL_B           |   300 |  3900 |    24   (5)| 00:00:01 |
|   4 |    INDEX RANGE SCAN         | TEST_TABLE_A_I1 |   101 |       |     2   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

   1 - SEL$1 / A@SEL$1
   3 - SEL$1 / B@SEL$1
   4 - SEL$1 / A@SEL$1

SQL_ID 2z5kjv7k63rdv
--------------------
/* SQL Analyze(35,1) */ SELECT A.*   FROM TEST_TABLE_A A      , TBL_B B
 WHERE A.P_NO2  = B.P_NO    AND A.P_CHAR = B.P_CHAR    AND
TO_CHAR(B.P_DATE, 'YYYYMMDD') = '20120801'

Plan hash value: 3921842617

-----------------------------------------------------------------------------------
| Id  | Operation          | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |              |       |       |  2534 (100)|          |
|   1 |  HASH JOIN         |              | 30012 |   967K|  2534   (3)| 00:00:31 |
|   2 |   TABLE ACCESS FULL| TBL_B        |   300 |  3900 |    24   (5)| 00:00:01 |
|   3 |   TABLE ACCESS FULL| TEST_TABLE_A |  2600K|    49M|  2495   (2)| 00:00:30 |
-----------------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

   1 - SEL$1
   2 - SEL$1 / B@SEL$1
   3 - SEL$1 / A@SEL$1


76 rows selected.


参考

2015-06-30

2015-06-29

SQLチューニング原論(仮)

もわっとしたイメージ重視のテキトーメモ。正確性、網羅性は重視していない。

チューニングの三原則

式で表すとこうなります。

f:id:yohei-a:20150705212319j:image:w360



仕事量(計算量)を減らすのが一番大切


データ構造の種類

アルゴリズム(実行計画)の種類

アクセスパス
  • 表スキャン
  • 索引スキャン
結合
  • 結合順
  • 結合方法
    • ネステッドループ結合
    • ハッシュ結合
    • ソートマージ結合
  • 結合種類
    • 内部結合
    • 外部結合
    • セミ結合
    • アンチ結合
  • 結合最適化

前提

  • SQL単体性能について書いている*3

関連

*1オプティマイザ統計情報

*2:ここではコストベースオプティマイザとする

*3:enqueue、latch、mutexといった並行処理での競合については考慮していない

2015-06-28

xargs -P vs split -n r/ の性能比較

ちょっとだけ調べたのでメモ。


実行時間(/usr/bin/time -p)

split は xargs より 2.6倍速い(xargs: 4.30秒、split: 1.66秒)

  • xargs -P
$ seq 10e3 | /usr/bin/time -p xargs -I{} -P4 sh -c '/bin/true {}'                      
real 4.30 ★
user 4.37
sys 6.24
  • split -n r/
$ seq 10e3 | /usr/bin/time -p ./split -u -n r/4 --filter 'while read i; do /bin/true $i; done'
real 1.66 ★
user 0.26
sys 0.89

システムコール所要時間・発行回数(strace -c)

  • wait4 + clone システムコールで split は7.5倍速い(xargs: 1.8秒、split: 0.2秒)。
  • wait4、clone システムコールのコール回数は split は4回だが、xargs は1万回以上と大きな差がある。
  • このケースでは多くの引数をパイプで渡しているが、CPU数分程度*1引数を渡して、xargs からコマンドが実行し、時間のかかる処理をするケースだと子プロセス生成回数が少なく、ここまでの性能差は出ないと思う。
  • xargs -P
$ seq 10e3 | strace -c xargs -I{} -P4 sh -c '/bin/true {}'                 
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 99.25    1.790977          63     28561           wait4 ★
  0.75    0.013581           1     10703       703 clone ★
  0.00    0.000000           0        14           read
  0.00    0.000000           0         4           open
  0.00    0.000000           0         7           close
  0.00    0.000000           0         5           fstat
  0.00    0.000000           0        14           mmap
  0.00    0.000000           0         3           mprotect
  0.00    0.000000           0         2           munmap
  0.00    0.000000           0         3           brk
  0.00    0.000000           0         1           rt_sigaction
  0.00    0.000000           0         1         1 access
  0.00    0.000000           0         1           execve
  0.00    0.000000           0         2           getrlimit
  0.00    0.000000           0         1           arch_prctl
------ ----------- ----------- --------- --------- ----------------
100.00    1.804558                 39322       704 total
  • split -n r/
$ seq 10e3 | strace -c ./split -u -n r/4 --filter 'while read i; do /bin/true $i; done'
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 99.94    0.248840       62210         4           wait4 ★
  0.04    0.000090           0     10001           write
  0.03    0.000070          18         4           clone ★
  0.00    0.000000           0         4           read
  0.00    0.000000           0         3           open
  0.00    0.000000           0        14           close
  0.00    0.000000           0         8           fstat
  0.00    0.000000           0         4         4 lseek
  0.00    0.000000           0        14           mmap
  0.00    0.000000           0         3           mprotect
  0.00    0.000000           0         5           munmap
  0.00    0.000000           0         3           brk
  0.00    0.000000           0         1           rt_sigaction
  0.00    0.000000           0         1           rt_sigprocmask
  0.00    0.000000           0         1         1 access
  0.00    0.000000           0         4           pipe
  0.00    0.000000           0         1           execve
  0.00    0.000000           0         8           fcntl
  0.00    0.000000           0         1           arch_prctl
------ ----------- ----------- --------- --------- ----------------
100.00    0.249000                 10084         5 total

生 strace で雰囲気を見てみる(strace -Tttf)

seq 10e3 | strace -o strace.log -Tttf xargs -I{} -P4 sh -c '/bin/true {}'
$ less strace.log
22098 23:40:53.530545 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7ff9c100e9d0) = 22099 <0.000052>
22099 23:40:53.530662 close(0 <unfinished ...>
22098 23:40:53.530701 wait4(-1,  <unfinished ...>
22099 23:40:53.530746 <... close resumed> ) = 0 <0.000048>
22098 23:40:53.530784 <... wait4 resumed> 0x7fff8cb7ae9c, WNOHANG, NULL) = 0 <0.000042>
22099 23:40:53.530821 open("/dev/null", O_RDONLY <unfinished ...>
22098 23:40:53.530861 clone( <unfinished ...>
22099 23:40:53.530895 <... open resumed> ) = 0 <0.000037>
22099 23:40:53.530973 execve("/usr/lib64/qt-3.3/bin/sh", ["sh", "-c", "/bin/true 1"], [/* 86 vars */] <unfinished ...>
22098 23:40:53.531059 <... clone resumed> child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7ff9c100e9d0) = 22100 <0.000166>
22100 23:40:53.531123 close(0 <unfinished ...>
22099 23:40:53.531168 <... execve resumed> ) = -1 ENOENT (No such file or directory) <0.000100>
22100 23:40:53.531213 <... close resumed> ) = 0 <0.000056>
22098 23:40:53.531266 wait4(-1,  <unfinished ...>
22100 23:40:53.531303 open("/dev/null", O_RDONLY <unfinished ...>
22099 23:40:53.531352 execve("/usr/local/bin/sh", ["sh", "-c", "/bin/true 1"], [/* 86 vars */] <unfinished ...>
22100 23:40:53.531428 <... open resumed> ) = 0 <0.000078>
22098 23:40:53.531466 <... wait4 resumed> 0x7fff8cb7ae9c, WNOHANG, NULL) = 0 <0.000167>
22100 23:40:53.531503 execve("/usr/lib64/qt-3.3/bin/sh", ["sh", "-c", "/bin/true 2"], [/* 86 vars */] <unfinished ...>
22099 23:40:53.531581 <... execve resumed> ) = -1 ENOENT (No such file or directory) <0.000157>
22100 23:40:53.531617 <... execve resumed> ) = -1 ENOENT (No such file or directory) <0.000037>
22098 23:40:53.531656 clone( <unfinished ...>
22100 23:40:53.531691 execve("/usr/local/bin/sh", ["sh", "-c", "/bin/true 2"], [/* 86 vars */] <unfinished ...>
22099 23:40:53.531808 execve("/usr/bin/sh", ["sh", "-c", "/bin/true 1"], [/* 86 vars */] <unfinished ...>
22100 23:40:53.531885 <... execve resumed> ) = -1 ENOENT (No such file or directory) <0.000079>
22099 23:40:53.531929 <... execve resumed> ) = -1 ENOENT (No such file or directory) <0.000048>
22100 23:40:53.531968 execve("/usr/bin/sh", ["sh", "-c", "/bin/true 2"], [/* 86 vars */] <unfinished ...>
22101 23:40:53.532048 close(0 <unfinished ...>
22099 23:40:53.532089 execve("/bin/sh", ["sh", "-c", "/bin/true 1"], [/* 86 vars */] <unfinished ...>
22098 23:40:53.532164 <... clone resumed> child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7ff9c100e9d0) = 22101 <0.000477>
22101 23:40:53.532214 <... close resumed> ) = 0 <0.000127>
22100 23:40:53.532265 <... execve resumed> ) = -1 ENOENT (No such file or directory) <0.000221>
22101 23:40:53.532307 open("/dev/null", O_RDONLY <unfinished ...>
22100 23:40:53.532348 execve("/bin/sh", ["sh", "-c", "/bin/true 2"], [/* 86 vars */] <unfinished ...>
22098 23:40:53.532416 wait4(-1,  <unfinished ...>
22101 23:40:53.532450 <... open resumed> ) = 0 <0.000106>
22099 23:40:53.532479 <... execve resumed> ) = 0 <0.000317>

環境

$ uname -r
2.6.39-400.17.1.el6uek.x86_64

$ cat /etc/issue
Oracle Linux Server release 6.6
Kernel \r on an \m

$ xargs --version
xargs (GNU findutils) 4.4.2
Copyright (C) 2007 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Built using GNU gnulib version e5573b1bad88bfabcda181b9e0125fb0c52b7d3b

$ ./split --version
split (GNU coreutils) 8.23
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Torbj&#246;rn Granlund and Richard M. Stallman.

補足

split の 8.4 は --filter オプションが使えなかったので、ソースを入手してコンパイルしました。

$ wget http://ftp.gnu.org/gnu/coreutils/coreutils-8.23.tar.xz
$ tar xfvJ coreutils-8.23.tar.xz
$ cd coreutils-8.23
$ ./configure
$ make
$ cd src
$ ./split --version
split (GNU coreutils) 8.23
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Torbj&#246;rn Granlund and Richard M. Stallman.

tar.xz を解凍する

$ tar Jxvf coreutils-8.23.tar.xz 

参考

xz はLZMA2圧縮アルゴリズムを利用する可逆圧縮ファイルフォーマットである。

xzは、gzipやbzip2のように、複数の圧縮ファイル結合をサポートしているが、二つ以上のターゲットファイルを一つのアーカイブにまとめることはできない。そのためxzはtarやcpioなどよってアーカイブされたファイルの圧縮に使用されることが多い。

先行するgzip, bzip2と比較すると、圧縮時にはこれら以上の時間とメモリを消費するが、圧縮率では概ね優位で、また伸張速度もgzipより多少遅いがbzip2よりは速い傾向にある。このことから、特にアーカイブ配布用途として、.tar.gzや.tar.bz2と並んで採用されるケースが増えている(.tar.bz2にとって代わる場合もある)。

xz (ファイルフォーマット) - Wikipedia

arコマンドのみでtar.xz形式のファイルを展開するには以下の構文になります。

GNU tar 1.22からxz形式をサポートしています。

tar Jxvf tar.xz形式の圧縮ファイル名

実際に実行した例を以下に記します。

$ tar Jxvf data.tar.xz 
wk2/
wk2/b/
wk2/b/data2.txt
wk2/a/
wk2/a/data1.txt
$ tree wk2
wk2
├── a
│   └── data1.txt
└── b
    └── data2.txt
逆引きUNIXコマンド/tar.xz形式ファイルを展開する - Linuxと過ごす

compat-libstdc++ をインストールしようとすると libc.so.6 が必要と怒られる

ちょっと質問されて回答したことをメモ。


事象

# yum install compat-libstdc++-33-3.2.3-69.el6.i686

...

エラー: 依存性の欠如:
        libc.so.6 は compat-libstdc++-33-3.2.3-69.el6.i686 に必要とされています

調査方法

$ yum provides */libc.so.6
glibc-2.12-1.47.el6.x86_64 : The GNU libc libraries ★←64bitしかインストールされていない
Repo        : installed
Matched from:
Filename    : /lib64/libc.so.6

原因


対処

# yum install glibc-2.12-1.149.el6_6.5.i686

参考

*1:使用するマシンでCPUを使って並列処理できる程度の数。他にCPUバウンドな処理は実行されていない前提。