タグ

ブックマーク / udzura.hatenablog.jp (17)

  • Apple Silicon上でx86_64のDockerを使う - ローファイ日記

    Apple Silicon上でLinux向けx86_64の環境が欲しくなったり、x86_64向けのバイナリやイメージを作らないといけなくなる事態は、稀に良くあると思う。 colimaを使うと、Aarch64なMac上であっても、かなり楽にx86_64のLinux環境とDocker環境が手に入る。 最近のcolimaには実は --arch というオプションがあり、x86_64又はaarch64であればあっさりと環境を作ることができるようになっている。 デフォルトで入ってくる環境と区別するため --profile オプションを明示する必要がある。 $ colima --profile colima-x64 start --arch x86_64 colimaの作ったDockerインスタンスは colima list で一覧できる。 $ colima list PROFILE STATUS AR

    Apple Silicon上でx86_64のDockerを使う - ローファイ日記
  • RubyKaigi takeoutでRuby to BPF compilerの話をした話 - ローファイ日記

    Rubyアドベントカレンダー(カレンダー2)の2日目です。 qiita.com 今見たらカレンダー2も半分以上埋まってて嬉しい... Ruby is alive now!!! ということで、RubyKaigi takeout 2021の振り返りも兼ねて作ったものの話です。 rubykaigi.org Rucy: A Ruby Compiler github.com RucyはRubyのスクリプトをコンパイルして直接特定のフォーマットのバイナリを吐き出すツールです。今のところBPFのバイナリにのみ対応しています。 ちなみに "Ru"by "C"ompiler -> RuC -> Rucy という経緯で、Rucyという綴りがそれなりにRubyと空目する点含めて(?) 気に入った名付けです。 Rucyについて把握する前にBPFの説明からしないといけないのですが、要するにLinuxの機能の一つで、

    RubyKaigi takeoutでRuby to BPF compilerの話をした話 - ローファイ日記
  • BPFバイナリはどのようなELF形式か(1) - 最低限の情報とは? - ローファイ日記

    主に9月に開かれる某Kaigiの関係とか、色々があり、C言語以外の言語でBPFバイナリを作ることができないか模索しています*1。某Slackなどで相談させてもらっていますが、こんな感じ(資料後半)。 docs.google.com その予備調査として、BPFバイナリとしてlibbpfが取り扱えるELF形式のバイナリがどのようなものか調べています。 これ、なんかドキュメントがあるような気もせんでもないですが、まあぼく自身ELF形式に詳しくないこともあり実際のファイルを眺めながら調べた結果*2を残しとこうと思います。 前回の記事で利用した、cgroup v2のデバイスフィルタに利用するBPFプログラムを、 udzura.hatenablog.jp 以下のコマンドでビルドします。 $ clang -O1 -c -target bpf dev_cgroup.c -o dev_cgroup.o まず

    BPFバイナリはどのようなELF形式か(1) - 最低限の情報とは? - ローファイ日記
  • BPF CO-RE バイナリはどのようにビルドされるか - ローファイ日記

    そろそろBPFのことを思い出そうと思って記事を書く。 シリーズです: udzura.hatenablog.jp udzura.hatenablog.jp 前回まででRustでのBPF CO-REバイナリの作成方法をまとめたが、C言語などで使う場合の細かい手順を追ってみる。 ちゃんとドキュメントを追い切れていないところがあり、今回は、iovisor/bccのlibbpf-toolsにあるMakefileなどを参照したことは了解願いたい。 github.com さて、利用するBPFプログラムは以下のようにする。 vfs_read をトレースして、読み込みに成功いたバイト数を、log2をbinとするヒストグラムにする。 #include "vmlinux.h" #include <bpf/bpf_helpers.h> #include <bpf/bpf_tracing.h> #include <

    BPF CO-RE バイナリはどのようにビルドされるか - ローファイ日記
  • cgroup v2の、BPFによるデバイスアクセス制御を試す - ローファイ日記

    RubyKaigiも近付いたしeBPFの機運を高めようとしている。 タイトルですが、そういうことができます。 www.kernel.org このドキュメントにも「どうすればできる」と言うところが書いておらず、最終的にカーネルのサンプルを眺めることになる。 elixir.bootlin.com elixir.bootlin.com 下準備 まず、cgroup v2が有効なカーネルを使う必要がある。いったん。Ubuntu Groovy(5.8.0-53-generic)を使う。 その上で、cgroup v1のdevicesコントローラを一応umountしておいいた。必要なのかはわからないが...。 $ sudo umount -l /sys/fs/cgroup/devices その上で cgroup v2のグループを作成。 $ sudo mkdir /sys/fs/cgroup/unified

    cgroup v2の、BPFによるデバイスアクセス制御を試す - ローファイ日記
  • eBPF的な意味で使えるcgroup idを取る方法 - ローファイ日記

    メモ程度に。 追記 @ 2021/04/20 12:41 inode番号と同じになるようになっているらしい。なので、 cgpath = ARGV[0] puts File::Stat.new(cgpath).ino これだけでいいです... 以下は、構造体キャストの例として残す。 github.com この実装によると name_to_handle_at をつかってcgroupを表すディレクトリ のファイルハンドルを取る ファイルハンドルを以下の構造体にキャストする struct cgid_file_handle { unsigned int handle_bytes; int handle_type; uint64_t cgid; }; そうすると handle->cgid に入ってる という感じっぽい。なので言語を選ばず実装できる。Rubyのようなスクリプト言語ならffi(fiddle

    eBPF的な意味で使えるcgroup idを取る方法 - ローファイ日記
  • RustでBPF CO-RE - とりあえずビルドしてみるの巻 - ローファイ日記

    2020年は色々やったんですが、不甲斐なさも残りました。2021年も頑張ります(1行で去年の総括と今年の抱負)。 で、RustとBPF CO-RE、2つのsota(2020年末に覚えた言葉の一つ) をブログに書いて気炎を上げていきたい。 (はじめに: 半分自分メモのつもりなんです! という言い訳をしておきます。認識や用語など間違いがあれば突っ込んで...) BPF CO-RE、コレってなんですか itiskj.hatenablog.com 上記記事に書いてある通り(さらに言えば Why We Switched from BCC to libbpf for Linux BPF Performance Analysis | PingCAP の通り)、BCCのプロダクション利用には、コンパイラやヘッダファイルなどたくさんの依存、実行時にコンパイルをすることによるオーバヘッドなど多くの問題があった

    RustでBPF CO-RE - とりあえずビルドしてみるの巻 - ローファイ日記
  • 超入門USDT - ローファイ日記

    Linuxアドベントカレンダー2020 8日目の記事です。前日はmomomo_rimotoさんの多段sshとchroot環境。そしていろいろなコマンドを使いたいでした。 qiita.com 今日はみんな大好きなeBPFにも関係して、特にUSDTという機能に関するお話をします。 USDT、それは USDT(User Statically-Defined Tracing) とは、要するに、ユーザランドにあるプログラムに対して、静的にトレースのための窓口(プローブ)を埋め込む仕組みです。トレースが無効の際はパフォーマンスが落ちないような工夫がされています。 詳細な説明は id:mrtc0 の記事の方がわかりやすいので、簡単な説明に留めますが... blog.ssrf.in カーネル側をトレースする際に、動的な関数などのプローブをkprobe、静的にカーネルに組み込まれたプローブをtracepoi

    超入門USDT - ローファイ日記
  • Kernel/VM/探検隊 online でRbBCCのLTをしました - ローファイ日記

    connpass.com Kernel/VM/探検隊 は憧れの勉強会だったので、とても緊張したのですが、オンライン化に伴い福岡からもLTチャレンジができるとのことでおしゃべりをしました。 speakerdeck.com Rubyアソシエーション助成対象でもあったRbBCCの簡単な紹介と現状の話をしました。 ブログでも書いてるやつです。Part 3書かないとね... udzura.hatenablog.jp udzura.hatenablog.jp 参加のふりかえり LTとはいえ参加者のレベルの高さもあるので、あまり間違ったことを言わないようベストを尽くしたつもりです... 結果的にはおおむねポジティブな反応をオンラインでいただけて良かったです。 ご指摘があった点として、ツールの比較の中でSystemTapやftraceもあるよという箇所がありました。 ftraceは以前少しだけ触ったのです

    Kernel/VM/探検隊 online でRbBCCのLTをしました - ローファイ日記
  • Time namespace を試す - ローファイ日記

    Time namespace と聞くと、Guitar Freaks & Drum Mania の名曲「Timepiece Phase II」を思い出してしまうんですが、僕だけでしょうか?僕だけですね...。 今日はLinux 5.6 でマージされたらしい、 Time namespace を触ってみることにしました。 git.kernel.org この辺りでマージされた機能ですね。 Linux namespace って? Linux のコンテナは、ホストから様々なリソースを独立させて切り離された「名前空間」に所属します。リソースの種類ごとに名前空間があり、例えばネットワークのNamespace、マウントポイント情報のNamespace、ホスト名などUTSのNamespaceなどなど、5.5までで7つのドラゴンボールこと名前空間が実装されていました。詳細は コンテナの基礎 tenforward

    Time namespace を試す - ローファイ日記
  • 自分のためのカーネルトレーシング、その1 - ローファイ日記

    色々な理由 でカーネルのイベントなどをトレースする方法を整理する必要が出て来たので。地道にやっていくシリーズ。最近シリーズものが続いてないのでまた中断される可能性が...。 今回は、カーネルのイベントソースとして tracepoint, kprobe, uprobe というものがあるが、それぞれを使って、違いを確認してみる。理解が間違っていたら教えてください。 環境は基的に、ご家庭の Ubuntu Bionic でシュッと試しているので、最新のカーネルというわけではない。 $ uname -a Linux ubuntu-bionic 4.15.0-55-generic #60-Ubuntu SMP Tue Jul 2 18:22:20 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux tracepoint Linuxカーネルには、内部で起こる様々なイベントを

    自分のためのカーネルトレーシング、その1 - ローファイ日記
  • eBPF for Rubyist 現状確認(2) - BPFQL の紹介 - ローファイ日記

    udzura.hatenablog.jp こちらの続きです。第2回は拙作「BPFQL」を紹介したく。RbBCCの実例として2つのプロトタイプを作ったうちの1つです。 まず、汎用トレースツール bpftrace の話 前回RbBCCを紹介しましたが、一般にRbBCCやBCCは「サーバの特定の状況をトレースするために」使われます。たとえばdisk I/Oのレイテンシが知りたい、ページフォールトの状況が知りたい、TCPパケットの受信状況は、などなど...。 go-vargo.hatenablog.com 「どういう状況の時に」BCC製の「どのツールが」使われるかは上記のvargoさんの記事にも一部紹介されています。 一方で、私たちの運用しているサーバはどういう状況に遭遇するか簡単には予測できない面もあります。そういう場合に、初動などで様々な値を汎用的に取れるようにしているツールとしてbpftra

    eBPF for Rubyist 現状確認(2) - BPFQL の紹介 - ローファイ日記
  • Rubyアソシエーション 開発助成金2019 の応募内容を公開します - ローファイ日記

    この記事はCfP Advent Calendar 2019の9日目です! adventar.org 1日勘違いしていました! カンファレンスではないですが「Rubyアソシエーション 開発助成金2019」への応募内容をここで公開します。って、していいものなのでしょうか...「アウトプットを期待」とのことだったのできっと大丈夫! www.ruby.or.jp 現在、YARV開発者の笹田耕一さんをメンターに迎えて、RubyLinuxの高機能トレス技術 eBPF のライブラリである BCC を使えるようにすべく移植実装と、+アルファの考え中です。それが RbBCC プロジェクトです。 github.com 将来は iovisor プロジェクトに寄贈したいと考えてもいるんですが、まずは完成度を上げねばという感じです...。 で、このRubyアソシエーション 開発助成、毎年なかなか募集に苦労している

    Rubyアソシエーション 開発助成金2019 の応募内容を公開します - ローファイ日記
  • Linuxでスレッドごとに固有のIDを発行できないか - ローファイ日記

    なるべく簡単なロジックで、おおむね被らないようなIDをスレッドごとに吐けないだろうか、それも同じスレッドなら何度呼び出しても同じIDになるやつ(=キャッシュが要らない)、と思ってこういうのを考えた。 とりあえずコード: #define _GNU_SOURCE #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/syscall.h> pid_t gettid(void) { return syscall(SYS_gettid); } unsigned long long getthreadseq(void) { pid_t tid = gettid(); char fmt[] = "/proc/self/task/%d/stat"; char statpath[sizeof(fmt)+10]; un

    Linuxでスレッドごとに固有のIDを発行できないか - ローファイ日記
  • PSIをLXCのコンテナで試す: その(1) CPU Pressure - ローファイ日記

    あらすじ PSIという新しいシステムプレッシャーの指標が Linux 4.20 から利用できます。という内容を前回のブログに書いた。 udzura.hatenablog.jp 今日はこのPSIについて、実際にシステムに負荷をかけたりして変動を眺める。 下準備として cgroup v2 をシステムで利用可能にする 大前提として: デフォルトの設定のままではsystemdcgroup v1を利用する あるプロセスがcgroup v1で制御されているとcgroup v2では制御出来ない こういう仕様があり、普通に起動してもcgroup v2のルートの cgroup.controllers は空っぽである。回避策はカーネルの起動パラメータ等でsystemdcgroup v2のみを利用させること。以下の記事に詳しい。 qiita.com この手順そのままに systemd.unified_cgr

    PSIをLXCのコンテナで試す: その(1) CPU Pressure - ローファイ日記
  • straceがどうやってシステムコールの情報を取得しているか - ローファイ日記

    興味があって調べていたら、少しだけ分かったのでまとめておきます。当然間違った箇所もある、あと考慮が漏れている箇所もあるかと思いますのでツッコミをお願いします… ptrace(2) システムコール strace の核となるシステムコールは ptrace(2) である。ptrace(2)を用いることで、あるプロセスを別のプロセスから監視し、シグナルごとに停止してレジスタやメモリの状態を観察したり変更したりできる。gdbのようなデバッガのブレークポイント、あるいはまさにstraceのような目的で利用される。 大まかな利用方法としては、親プロセスの ptrace(PTRACE_ATTACH, pid, ...) (または子プロセスの ptrace(PTRACE_TRACEME, 0...))によりトレースが開始し、wait()などで停止を待ってから様々な設定を親から送り、 ptrace(PTRAC

    straceがどうやってシステムコールの情報を取得しているか - ローファイ日記
  • Linuxプログラミングインターフェースを読んだ(一周目) - ローファイ日記

    読みきった。一周目の所感を書く。 Linuxプログラミングインタフェース 作者: Michael Kerrisk,千住治郎出版社/メーカー: オライリージャパン発売日: 2012/12/01メディア: 大型 クリック: 14回この商品を含むブログ (7件) を見る モチベーション ぼくは、小さい会社でWebサービスの開発もしつつLinuxのサバ管も少ししつつ、という人間だったので、Linuxに開眼して真髄を会得したい、という欲求が長らくあった。例えば青木さんのであったり、なるほどUnixであったり。 ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道 作者: 青木峰郎出版社/メーカー: ソフトバンククリエイティブ発売日: 2005/07/27メディア: 単行購入: 35人 クリック: 450回この商品を含むブログ (150件) を見る tatsu

    Linuxプログラミングインターフェースを読んだ(一周目) - ローファイ日記
  • 1