Linux:パフォーマンスに影響あるデバッグオプションがどれだけ影響あるか試してみた

なんとなくやってみた系ですね。

今回はCONFIG_DEBUG_OBJECTSのところです。

f:id:masami256:20180706233206p:plain

CONFIG_DEBUG_OBJECTS_FREEがkmalloc/kfreeをヘヴィにつかうような場合にパフォーマンス劣化するよーなんていってます。

f:id:masami256:20180706233254p:plain

まずはCONFIG_DEBUG_OBJECTSの項目を全部無効にした場合。

この時点でもロック周りに時間取ってますね。

f:id:masami256:20180706233504p:plain

hackbenchを引数 10 process 20000 で実行してる時の様子がこんな感じです。

f:id:masami256:20180706233612p:plain

次にCONFIG_DEBUG_OBJECTSの項目を全部無効にした場合。

起動した時点でかなりの時間をロックで使ってます。

f:id:masami256:20180706233435p:plain

そして、hackbenchを同じく実行するとこうこうなります/(^o^)\

f:id:masami256:20180706233745p:plain

このときはこんな感じになっていてもうどうにもならない感がありますね。

f:id:masami256:20180706233833p:plain

説明に書いてあるとおり、ほんと遅くなりますね。

( ´ー`)フゥー...

日経Linux 2018年 7 月号

日経Linux 2018年 7 月号

qemu: pyhtonでゲストとシリアル通信

ゲスト側のLinuxカーネルでシリアルコンソールを有効にしているときに、ホストからpythonでシリアルコンソールにアクセスするときメモです。

ゲスト側はカーネルコマンドラインでシリアルの設定をするのと、qemuのオプションで-serial ptyとしてptyを使うようにする。

$ qemu-kvm -initrd ./initramfs-4.17.2-200.fc28.x86_64.img -kernel ./vmlinuz-4.17.2-200.fc28.x86_64 -m 512 -append "console=ttyS0,115200" -serial pty -nographic
QEMU 2.11.1 monitor - type 'help' for more information
(qemu) qemu-system-x86_64: -serial pty: char device redirected to /dev/pts/2 (label serial0)

pythonのコードは特にパッケージとかはインストールしていなくて、qemu起動時に表示された /dev/pts/Xをオープンしてデータの読み書きを行います。

#!/usr/bin/env python3
#  qemu-system-x86_64 -initrd ./initramfs-4.17.2-200.fc28.x86_64.img  -kernel ./vmlinuz-4.17.2-200.fc28.x86_64 -m 512 -append "console=ttyS0,115200" -serial pty -nographic

import io, os
pty = io.TextIOWrapper(
    io.FileIO(
        os.open(
            "/dev/pts/2", os.O_NOCTTY | os.O_RDWR
        ),
        "w+"
    )
)
pty.write("uname -a\n");
for line in iter(pty.readline, None):
    print(line.strip())

こんな感じで使えます。

f:id:masami256:20180701003342p:plain

TwitterのPC版のUIからだと連携解除できないappの連携解除方法メモ

iPhoneとかで連携したappの一部はPCのWeb版からだとrevokeできなかったのでやり方のメモです。

PCのWeb版だと連携しているアプリを見るとLearn how to revoke an iOS appとリンクがあるだけでRevoke Accessボタンがないappがあります。Twitter for iPhoneとかを使ってるアプリがこうなってるようです。

revokeしたい場合はスマホのアプリもしくは、モバイル版のtwitterにアクセスしてrevokeします。 ただ、それでも個別にrevokeということは出来ないのでiPhoneを使っているならTwittre for iPhoneをrevokeします。そうするとこのrevokeに連動してTwitter for iPhoneと連携しているappが一気にrevokeされます。 もし、許可したいappがある場合は再度許可してあげる必要があります。

週刊? Linux Kernel Patch Watch 20180520

前書き

細かいpatchも見ているとなるほどーなとか勉強になりますね

今週のpatch

2038年問題対応

[PATCH 0/6] Transition vfs to 64-bit timestampsです。VFSがstruct timespecを使っているところで、この構造体は2038年問題があるのでstruct timespec64に置き換え。

typo修正

[PATCH] cramfs: Fix IS_ENABLED typoです。 fs/cramfs/inode.cで4.15からtypoってたようです。利用者数とかもあるんでしょうけど、意外と気付かれないものですね。

boot初期のhashed pointer表示

[PATCH] vsprintf: Add command line option debug_boot_weak_hashです。早い段階だと十分なエントロピーがないため、ポインタのアドレスをhash値で表現できずに固定の文字列表示になってしまうのですが、これだとデバッグが難しいということで、bootの初期段階でもhash値を作れるようにするpatchです。

空の/proc//cmdlineは許可しない

[PATCH] proc: Don't allow empty /proc/PID/cmdline for user tasksです。カーネルスレッドがの場合、/proc//cmdlineが空になっていて、ps(1)等はこれでプロセスがカーネルスレッドか判定してるそうです。ただ、この挙動は普通のユーザーランドのプログラムでエミュレートできるので止めようとのことです。

secompのフィルターに引っかかったらユーザ空間に通知

[PATCH v2 0/4] seccomp trap to userspaceです。secompでフィルターに引っかかったらそれをユーザーランド側に通知する仕組みの追加です。カーネル側に色々と処理を持たすよりもユーザーランド側で処理するようにしたほうが柔軟にもなりますね。

その他

UPのシステムでfor_each_cpu()がバグってる?

for_each_cpu() is buggy for UP kernel?です。

以下のイテレータで、システムがUni Processorな場合でmaskに0が設定されていてもmaskの値が無視されているからループが一回走ってしまって良くないということです。

#define for_each_cpu(cpu, mask)                 \
        for ((cpu) = 0; (cpu) < 1; (cpu)++, (void)mask)

4.16.10だとUPでない場合はfor_each_cpu()はこのようになっていて、maskの値が使われます。

/**
 * for_each_cpu - iterate over every cpu in a mask
 * @cpu: the (optionally unsigned) integer iterator
 * @mask: the cpumask pointer
 *
 * After the loop, cpu is >= nr_cpu_ids.
 */
#define for_each_cpu(cpu, mask)                \
   for ((cpu) = -1;             \
       (cpu) = cpumask_next((cpu), (mask)),    \
       (cpu) < nr_cpu_ids;)

これについては過去に議論されたけど、結論はでてないとのことでした。

あとがき

(´-`).。oO(遅れましたがなんとか

週刊? Linux Kernel Patch Watch 20180511

前書き

(´-`).oO(ほんとに小ネタが多いな

今週のpatch

vdsoの未使用ファイル削除

[PATCH] x86/vdso: remove unused fileです。読まなくて良いファイルが消えるのは良いことですね。

gcc8でobjtoolのワーニングがたくさん出る問題

Kernel build with gcc 8 a lot of warningsで相談が始まり、[PATCH 0/3] objtool: GCC 8 supportでpatchが投げられてます。こちらのレスポンスで具体的な問題の内容とか修正内容の説明もされてます。 Fedora 28、Archあたりはgcc8なので影響受けている人いますね。

フォーマット指定しのチェックをするのに__printf()が良いよ

[PATCH] slub: add printf verification to ‘slab err’:で、__printfでチェックすると良いよという感じのpatchです。

--
 mm/slub.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/mm/slub.c b/mm/slub.c
index 44aa7847324a..7d38cfb6a619 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -711,7 +711,7 @@ void object_err(struct kmem_cache *s, struct page *page,
    print_trailer(s, page, object);
 }
 
-static void slab_err(struct kmem_cache *s, struct page *page,
+static __printf(3, 4) void slab_err(struct kmem_cache *s, struct page *page,
            const char *fmt, ...)
 {
    va_list args;

__printfは以下のようなマクロです。

#define __printf(a, b)  __attribute__((format(printf, a, b)))

gccのマニュアルにformat attributeの説明があります。

CVE-2018-8897のテストコード

[PATCH] selftests/x86: Add mov_to_ssです。 POP SS debug exception - CVE-2018-8897 [Moderate] & CVE-2018-1087 [Important] - Red Hat Customer Portalのテストコードです。

その他

printfデバッグではなくてftraceを使おう

Re: [PATCH] staging: most: video: use func instead of function nameです。printfデバッグじゃなくてftrace使えば良いじゃんって話です。

3.2系カーネルのEOLはいつ?

EOL for the 3.2 kernel?です。後一回は最低でもリリースするとのこと。

あとがき

(´-`).oO(kernelのコードネームが変更されましたね(ー_ー)!!

週刊? Linux Kernel Patch Watch 20180504

前書き

今週もなんとか小ネタを集めて。。。

今週のpatch

IRQのon/off切り替わり時のトレースポイントでパフォーマンス劣化してた

[PATCH RFC] tracepoint: Introduce tracepoint callbacks executing with preempt onです。hackbenchで〜10%のパフォーマンス劣化があったということです。RCUからSRCUを使うような修正になっています。

kdumpで大きなサイズのメモリを確保する時の処理を修正

[PATCH 1/2] kdump/x86: crashkernel=X try to reserve below 896M first then below 4G and MAXMEMです。crashkernelオプションに指定するメモリサイズが〜896MB以下のアドレス範囲から取得できなかった場合の処理が追加されています。内容としては〜896MB以下から取得できなければ〜4GBの範囲から、それでもダメならMAXMEMの範囲まで含めて確保しにいくようになってます。

GCCデバッグ向けの最適化オプションを使うようにする

[PATCH 0/5] kernel hacking: GCC optimization for debug experience (-Og)です。GCCの最適化オプション(-O2とか-Os)に-Ogというのもあって、ドキュメントにはOptimize debugging experience. -Og enables optimizations that do not interfere with debugging. と説明されています。これを使うようにしては?というpatchですね。やはり多少のパフォーマンス劣化はあるみたいです。

boot処理の早い段階でvsprintf()の%pでhash値を出せるようにする

[PATCH 0/3] enable early printing of hashed pointersです。boot処理の早い段階でフォーマット指定子の%pが使われるときに乱数のキーが決まっていない場合は、hash地ではなくて(ptrval)という文字列になるけど、これはデバッグしにくいのでカーネルコマンドラインオプションにキーを渡せるようにしてはどうかというpatchです。

lib/vsprintf.cにあるptr_to_id()の以下の部分が文字列返しているとこです。

 if (unlikely(!have_filled_random_ptr_key)) {
        spec.field_width = default_width;
        /* string length must be less than default_width */
        return string(buf, end, "(ptrval)", spec);
    }

printk()の%p系のフォーマット指定子を処理しているのはpointer()という関数です。

nanoMIPSアーキテクチャ

Introducing a nanoMIPS port for Linuxです。New MIPS I7200 Processor Core Delivers Unmatched Performance and Efficiency For Advanced LTE/5G Communications And Networking IC Designs – MIPSでアナウンスされたCPUのportingです。このCPUについてはMIPS、初のnanoMIPS命令セット対応CPUコア「I7200」 - PC Watchでも取り上げられてます。

その他

rt-testsの最新版リリース

[ANNOUNCE]rt-tests-1.3 New Devlopment version of rt-testsです。realtime:documentation:howto:tools:rt-tests [Linux Foundation Wiki]に説明があります。hackbenchとかのテストツールのコレクションですかね。fedoradebianubuntuなどはパッケージもあります。

あとがき

(´-`).。oO(hash値のアドレスを使ってうまくデバッグするのはどうやるんだろ?

例解UNIX/Linuxプログラミング教室: システムコールを使いこなすための12講

例解UNIX/Linuxプログラミング教室: システムコールを使いこなすための12講

GRUB2(UEFI)のコンソールからの起動メモ

たまにやる必要があったりするのでメモです。

まずは。。。 pagerを1に設定することで、出力内容が多い時に(catとかで)moreとlessみたいに1ページ毎にページ送り出来ます。これないと辛い。。

f:id:masami256:20180502235845j:plain

setコマンドで引数渡さなければ現在の設定が見れます。これで今の設定を確認。

f:id:masami256:20180502235919j:plain

ここで知りたいのはrootがどこかというとこです。このPCだと(hd1,gpt1)。

f:id:masami256:20180502235928j:plain

このrootは/bootではなくて/boo/efiです。

/dev/sda1 on /boot/efi type vfat (rw,relatime,fmask=0077,dmask=0077,codepage=437,iocharset=ascii,shortname=winnt,errors=remount-ro)

よって、ls (hd1,gpt1)/をするとこうなります。efiディレクトリとかがあります。 f:id:masami256:20180503000058j:plain

Linux上で見るとこうなってます。

masami@saga:~$ sudo ls -al /boot/efi/
total 44
drwx------. 3 root root 16384 Jan  1  1970 .
dr-xr-xr-x. 5 root root  4096 May  3 01:57 ..
drwx------. 4 root root  4096 Mar  7 04:23 EFI
-rwx------. 1 root root 12288 Jan  1  1980 FSCK0000.REC
-rwx------. 1 root root  8192 Jan  1  1980 FSCK0001.REC

grubの設定ファイルであるgrub.cfgはfedoraなら/boot/efi/EFI/fedora/grub.cfgにあるので、grubでのpathは(hd1,gpt1)/efl/fedora/grub.cfgとなります。

f:id:masami256:20180503000205j:plain

次にLinuxカーネルコマンドラインに渡すroot=オプションの値を調べます。fedoraはrootには/dev/sda2とかのデバイスファイル名を渡さずにroot=UUID=uuidの文字列という感じでオプション渡しますが、これを入力するのは大変なのでデバイスファイル名で渡します。 まずはgrub.cfgをcatで開いて、grubのsetコマンドでrootを指定しているところを調べます。(hd0,gpt2)がsetされてます。

f:id:masami256:20180503000253j:plain

Linuxカーネルの設定はbios版はlinuxでしたが、uefi版はlinuxefiです。initrdのほうもefiが後ろに付きます。/bootは(hd1,gpt2)/だったので、(hd1,gpt2)/vmlinuz〜のようになります。

f:id:masami256:20180503214622j:plain

あとはbootコマンドで起動します。

( ´ー`)フゥー...

まんがでわかるLinux シス管系女子(日経BP Next ICT選書)

まんがでわかるLinux シス管系女子(日経BP Next ICT選書)