Skip to content

Instantly share code, notes, and snippets.

Device Mapper Statistics for PCP

Abstract

Performance Co-Pilot (PCP) is a system performance and analysis framework. It has an agent-based architecture, which has many kinds of agents called PMDAs, Performance Metric Domain Agents are responsible for collecting performance metrics. Each agent reports the collected metrics to a daemon, called the PMCD, Performance Metric Collection Daemon. We can see the collect values with PCP's set of client tools, pmval, pminfo, pmrep, etc.
Device-Mapper is the Linux kernel framework for mapping physical block devices onto higher-level virtual block devices. It realizes software RAIDS, IO multipath, cache volumes, thin provisioning and snapshots.
To investigate Device-Mapper devices behavior, we sometimes need more flexible statistics data than traditional iostat data. To make life easier for users who would like to use the PCP tools for their performance measurements and monitoring, We will create a new PCP PMDA that pr

#!/bin/bash
# Variable settings
Digit_2=0.005
Digit_1=0.05
atexit() {
[[ -n ${tmpfile-} ]] && rm -f "${tmpfile}"
}
#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/fs.h>
enum test_type {
IOC_VERSION = 1,
IOC_FLAGS,
#define _GNU_SOURCE 1
#include <stdio.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
@4ge32
4ge32 / README-ja.md
Last active February 20, 2019 08:56
環境の作り方とAEONの試し方

前提条件

基本的にはFedora28以上を入れておくのが一番簡単かと思います. Linuxカーネルはバージョンが4.17.19以上である必要があります. Linuxカーネルは以下のコンフィグが有効になっている必要があります. 最近の一般的なディストリビューションだと有効になっていることが多いとは思いますが, 自前でカーネルをビルドする場合や機能が有効にならない場合は有効化・確認をする必要があります.

CONFIG_BLK_DEV_RAM_DAX=y
CONFIG_FS_DAX=y
CONFIG_X86_PMEM_LEGACY=y
  • PMEM as RAMがマージされた.not entirely happy らしいが,将来的な開発も含めてのことのよう.

  • PMEMがrepeat instructionsでエラーを起こしやすいのはブート時にRAMのようにscrubbedの必要がないから(scrubすれば良いような気もするが,memory modeだと多分されるような気がする,予想)

  • どうやらmcsafeを常に使ってpmemを読むらしい.ということは,System RAMだとしてもpmemがSystem ramとして登録されているということをカーネルは認識しているということになる.認識しているならmemcpy_mcsafe()が呼ばれるのはdrives/nvdimm/pmem.cから分かる.

  • 結局memcpy_mcsafe()が遅いっていうところがannoyingということなんだろうか.それだけだったようには思えないが?

Merge tag 'devdax-for-5.1' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm

A fork() in the road を読んで

HotOS 2019 で Microsoft Research からの論文である.Unixの代表的なシステムコールであるfork()についての問題点を挙げている.

概要

fork()は最も基本的なシステムコールといっても良く,新しいプロセスを作るときに使われる.今回の論文の主張はfork()は1970年代のマシンではハックと呼べるものだったが,現代では過去の負債となっているというものでおり,カーネルから完全に取り除くべきであるというものである.ただし,ここでいうカーネルとはLinuxカーネルのことを直接指しているのではなく,著者の先行研究でのOSの実装のことを指している.

面白いのは,fork()は研究者にとっては研究を阻害するといったことや,教育者は歴史としては教えるべきだが最初に教わるべきプロセス作成の仕組みとしてはふさわしくないといった中々過激なことを言っているところである.

問題点

現代的なコンピュータシステムにおける問題点として次のようなことが挙げられている.

  • かつてはシンプルであったが,最早そうではない
  • 25もの特別なケースが親プロセスの状態を子プロセスにコピーするときに存在する.例えば,ファイルロック,タイマー,非同期IOやトレーシングなど.また,コピー後のメモリマッピングに関して,madvice()に与えるフラグも非常に多いものとなっている.
diff --git a/scripts/Makefile.build b/scripts/Makefile.build
index 0d434d0afc0b..63eb7ab3e06a 100644
--- a/scripts/Makefile.build
+++ b/scripts/Makefile.build
@@ -458,7 +458,7 @@ endif
# module is turned into a multi object module, $^ will contain header file
# dependencies recorded in the .*.cmd file.
quiet_cmd_link_multi-m = LD [M] $@
- cmd_link_multi-m = $(LD) $(ld_flags) -r -o $@ $(filter %.o,$^)
+ cmd_link_multi-m = $(LD) $(ld_flags) -r -o $@ $(filter %.o %.a,$^)

シグナル

Call tree

  • pthread_kill(3)などはtgkill(2)を用いて実装されている

シグナル生成&配送

SYSCALL_DEFINE(tgkill)
- do_tkill

Run the Linux kernel and Busybox on QEMU

AArch64

Build Linux kernel

make ARCH=aarch64 menuconfig
make CROSS_COMPILE=aarch64-linux-gnu- -j8

Build Busybox