php の文字列連結時に呼び出される mremap(2), mmap(2)

イントロ

とある php なサービスを動かしている production サーバで、 100% CPUバウンドな php-fpm プロセスが複数いたので調査をしていた。

調べていた内容

strace を取ると、 mremap(2) をひたすら繰り返しているだけのプロセスだった。 gdb でphp レベルのバックトレースを採取 してソースコードと照らし合わせた読んだ所、アプリケーションのバグで以下のような挙動になっていた

  • ループの内部で文字列連結を行っている
  • バグで無限ループしちゃってる

というものだった。ああ、無限文字列連結 …

文字列が長くなるほど必要なメモリが増えるので、 php のランタイムがメモリを割り当てる際に mremap(2) を呼び出しているのだろうとアタリをつけた

擬似コードで再現

続きを読む

東京〜仙台 🚲

9/15(金) 東京から仙台まで走った

f:id:hiboma:20170919095732p:plain

  • 走行距離 356 km
  • 獲得標高 1570 m
  • 経過時間は 20時間38分 (実走時間は 14時間25分)

今年の夏休暇に二日かけて走破したルート を一日で走った。ひたすら丸一日 自転車で走ってみるのをやってみたかったのが、ようやく実現できた

ルート

前回とほとんど同じで国道4号線を北上する。寄り道は最低限

03:00 出発

続きを読む

多摩サイ〜 CROSS COFFEE 🚲

9/18 (月) 台風一過で強烈な日差し

f:id:hiboma:20170920115730p:plain

仙台に行った疲労が抜けきってないので、適当にあちこちうろついておしまい

よみうりランド

急坂をのぼって気合を入れる

続きを読む

Python + folium で Strava の "全"記録を地図で可視化 🚲

昨年から自転車で遠出をする機会が増えて、走ったルートを Garmin Edge で記録していた。Garmin Edge の記録は Garmin ConnectStrava 等の Web サービスで可視化できる

f:id:hiboma:20170315113719p:plain

記録が増えてくると 過去の記録を全部重ね合わせた1枚の地図 を作ったらおもしろいんじゃね?という疑問がでてきた。 自分の知る限りでは複数回の走行記録を表示できるサービスはないようなので自作した

(追記)

Strava で有料プランを使うとよいっぽい。後からみつかるんだよな。こういうの〜〜

blog.strava.com

Python + folium がよいかんじ

いろいろ試行錯誤してみたところ Pythonfolium というライブラリを使うことで 期待に沿った地図がつくれた

過去に記録した緯度・経度をプロットするだけで こんな地図になる。花弁のように青く広がっている線が、私が過去に走行した全軌跡

f:id:hiboma:20170912172822p:plain

地図は HTML + JS で生成されていて、移動やズームできる

続きを読む

国道299号線〜刈場坂峠〜彩の国ふれあいの森 🚲

国道299号線で正丸トンネルまで向かい、刈場坂峠、彩の国ふれあいの森までのぼってきた

f:id:hiboma:20170911110736p:plain

走行距離 108km 獲得標高 1647m

国道299号線

残暑で暑いデスネー

先週 も見つけた、青い タヌキ 猫型ロボットを拝む

続きを読む

pagemon でプロセスのメモリマッピングを覗き見る

pagemon というツールを知ったので、使い方を調べつつ何かしら学習ネタにできないかと考えた

smackerelofopinion.blogspot.jp

基本的な使い方

-p で観察したいプロセスの pid を指定して起動する。特権が必要なので sudo なり root なりで実行するナリ。

sudo pagemon -p <pid>

f:id:hiboma:20170907220324j:plain

するとプロセスの仮想アドレスと対応するページフレームの情報を取れる!

続きを読む

ps コマンドの %CPU がどのように計算されるかソースを追う (3) - top との算出方法の違い

hiboma.hatenadiary.jp

hiboma.hatenadiary.jp

上のエントリを書いみたものの、腑に落ちない疑問が残ったので、検証をしてみて整頓した

疑問

前回確かめたのはps%CPU が指すのは、プロセス(タスク) が開始してから消費した user 時間 + system 時間の割合だった。

  • ps が出すのは単位時間(例: 1秒とか ) あたりの CPU使用率 ではないよな? 一方で top は指定した間隔秒あたりの CPU使用率 を出すはず
  • ブロックする時間( sleep、ディスク I/O 、カーネル内のセマフォ等のロック待ち、スケジューラのレイテンシ, … ) が増えると、%CPU の数値は下がるよな?

… と疑問が残ってしまった。手を動かして確かめるのがよいだろう

検証

CPUバウンドなワンライナーCPU使用率pstop とで計測して、数値の違いを見ていく

続きを読む