キャッシュは外れるものである ~不本意なシステム高速化技法

基本的にキャッシュに頼った高速化はキャッシュミスが発生したときのペナルティーがあるので、なるべくボトルネックになる部分を特定して、それを解消するべきだと思っています。

例えばHDDをSSDに完走しての高速化とか、十分なメモリを積んで仮想記憶に頼らない運用とか。ソフトウェアに関しては時間のかかる処理はさせない、どうしても外せない時間のかかる処理は計算できるものはあらかじめ計算してオンデマンドでの処理を減らすなど。(これにはデーターベースのインデックスの整備も含まれます)
CPUを増やしての高速化は費用対効果考えると割と後回しにしたい高速化技法ですね。でも、GPGPUやFPGAで割と単純だけ処理するデータ量が莫大なものを処理する方法はいいと思っています。
実際にはコスト対効果を狙って、良く使うデータだけバイト単価の高い高速記憶装置(キャッシュメモリー)に置いて高速化。

APCを選択したのは、xhprofというPHPのプロファイラーで一番時間かかっているのが、日本語化処理だったので。(次に遅かったのがmysql部分。)

さて、今回sakuraインターネットのVPSでやたらwordpress(BuddyPress,bbPress付き)が遅くてどうしようもなかったのでいろいろ調べてみました。
まず、topコマンド。CPUタイムは10%も消費していません。disk I/Oが問題なんだろうと当たりをつけてswapoffコマンド。仮想記憶を停止します。これはメモリ消費が1GB中40%程度だったのでそうしました。
次にSSDのサーバーに載せ替えてもらえないかと打診したら予算の都合で却下。

まあ、ある意味に予定調和。(苦笑)

ちなみに、
# dd if=/dev/zero of=aaa.bin bs=1024 count=1024000
1048576000 bytes (1.0 GB) copied, 10.5271 s, 99.6 MB/s
# dd if=aaa.bin of=/dev/null
1048576000 bytes (1.0 GB) copied, 98.8714 s, 10.6 MB/s
disk readがお話にならないくらい遅い。通常のデスクトップPCで80MB/sくらいです。

この状況だとdisk readを最小に抑える工夫が効果ありそうですね。
wordpressのDB構造、インデックス(計算できるところは先に計算しおくタイプの効率化)が全然やっていないので(まあ、プラグイン都合で変わるのでwordpress本体ではどうにも出来ないし、プラグイン側でDB構造にちょっかいだすわけにもいかないんでしょうね。)しかたない部分はあります。
そんなわけで、PHPにAPCを入れました。共有メモリにある程度一度計算した内容をバッファリングしてくれます。
これで一発目は仕方ないにせよ、二回目以降はまあまあ実用的な速度で動いてくれるようになりました。とっても不本意。

APCを選択したのはxhprofというPHPのプロファイラーで時間がかかっているのが日本語化しょり、ついでmysqlのアクセスと特定できたから。

DBのインデックスの見直しは時間ができたらやることにして、当面はコンテンツの流し込みですねー。

CAT端末

emailとfaxを単一インターフェイスから送信できるラッパーを書いた
(裏の名簿管理もapache+php+sqlite3で書いたけど)。

本日、お客さんのところで送信の第一段を実行。

pearのライブラリの不足でエラーがでましたが(pearのMailを入れても、Net_smtpが依存関係を評価して自動で入ってくれていなかった。手動で対応した。)、まあ、すぐにインストールしててメールはクリア。

しかし、同時にキックしたFAX送信が進まない!

no dial tone!!

何のことはないfaxモデムに接続していたはずのケーブルが知らぬ間にCATへ繋がってた!!

これって、カード会社にクレーム入れればいいの? 仲介した某第一地方銀行に文句言えばいいの?

Androidのブラウザで広告をカットしてみた。

通信容量の制限のある格安SIMを使っています。
一晩に200MB近くデーターが流れてアレ?っと思いました。その日見ていたのはテキストベースのいわゆるWeb小説というものでした。アニメーションGIFの広告が容量使っているんだろうなぁ。。。。

そんなわけで、広告表示の制限を入れました。
(運営者さんごめんなさい。広告表示でサイトを運営しているのでしょうから迷惑ですよね。でも普段はPCから広告付きでちゃんと見ていますのでご容赦ください。。。)

さて、当方の環境はasus zenfon5 Android4.4です。

最初はhostsの書き換えで対応するつもりでしたがrootの取得が必須のツールばかりなので諦めました。

次に、filter proxyをストアから導入。データ通信のproxy設定を127.0.0.1のport 8000に設定。今回私がブロックしたかったアニメーションGIFをホストしているサーバーがブロックリストにデフォルトで入っていたのですんなりブロックできました。filter proxyは自分で禁止リストを追加できるので必要に応じて調整はできます。

さて、これでどれだけ通信を制限できるか、来週末確認してみます。

HDMI==>mini D-Sub15変換

http://www.amazon.co.jp/gp/product/B012FWU9J2/

上記の商品、Raspberry Piとの接続が言及されています。
付属のマイクロUSBを接続すればMacBookやRasPiと接続可能とありましたが、マイクロUSBのコネクタがありません。まあ、商品の写真にもありませんでしたのでそこはあまり疑問に思いませんでしたけど(苦笑)
おそらくamazonの商品紹介文は、このシリーズのactiveタイプの紹介文を間違って掲載しているのではないかと思います。

それで、現状、本題のMacMiniでは使用出来ていませんが、RasPi Bとの接続はうまく行ったので事例として紹介したいと思います。

/boot/config.txtの該当個所を

hdmi_ignore_edid=0xa5000080
hdmi_group=2
hdmi_mode=35

と書き換えて、NECの72VM-V、SXGA(1280×1024)にモニターの切替器を挟んで使用して表示されました。

長時間回したわけではないので安定性については未確認です。(^^;;

hdmi_mode=35でSXGAですが、これを16にすると、XGA(1024×768)になります。その他の解像度は https://www.raspberrypi.org/documentation/configuration/config-txt.md をご確認ください。

Raspberry Pi 3 B

http://jp.rs-online.com/web/p/products/8968660/

うーん、無線モジュールを標準搭載ということで、技適はどうなるんだろう?っと思っていたらやっぱりこういうオチみたい。(苦笑)

"本開発キットは技術基準適合証明を受けておりません。本製品のご使用に際しては、電波法遵守のため、以下のいずれかの措置を取っていただく必要がありますのでご注意ください。"

消費電力も5V2.5Aとなり、使いどころが狭まった感じですね。

"WindowsでIoT"という層にアピールするにはARM系CPUで厳しいような気もしますけどどうなんでしょうね。

自治体から飛んでくるエクセルファイルが見た目優先で出来ているのでつらい

表題の件。

世の中には、"メラビアンの法則"というのがあるようで、「人は見た目9割」とかいいますが。。。

でも、エクセルでそれやるは止めてください。(白目

データーベースのシートと印刷用のシートを分けてくれればそれでいいんですけどねー。

縦方向のセルを結合されると、データーベースにデータを食わせるのに分割して、ここのセルに値をコピーしないといけません。

なんというか、excelにデータベースのシートと印刷用のシートを仲立ちするフレームワーク的なマクロ集みないなものがないもんですかね~。

phpでマルチプロセス

<?php
$n = 8;
$time_start = microtime(true);
$fp=array();
$work=array();
for($i=0;$i<$n;$i++){
$fp[$i]=popen(‘sleep 5′,’r’);
}

for($i=0;$i<$n;$i++){
$work[$i] = fread($fp[$i],1024);
}
for($i=0;$i<$n;$i++){
echo $work[$i];
pclose($fp[$i]);
}
echo microtime(true) – $time_start;
?>
これ、5秒で終わります。もちろん、sleepなのでほぼ同時に8つのプロセスが終了するからこれでもんだいを生じていないだけなんですけどw
やっていることは、5秒待機するsleep 5を8プロセス同時に稼働させたということです。
各プロセスの処理が均質なら、この程度のコードでもシングルスレッドのはずのPHPでもマルチプロセスで処理が可能です。そこまで考えるならpcntl_waitpid()を使う必要がありますね。

やりたいことは、4core/8thredのcore i7を積んだマシンで、100件規模の会員さんにメールないしはFAX送信を統一的に行いたい。メールは、まあメーリングリストの手法は数多あるので問題ないのですが、問題はFAX。結構処理の時間がかかりそう。せっかくのcore i7なので、マルチプロセスにする方法を考えました。まあ、モデムというか回線は一本なのでプリントキューに送った後は地道に一件づつ処理なのですが、送信するpsファイルを処理する部分はマルチプロセスにしたかったんですよね。

あ、FAXが送れると言うことはやれば窓付き封筒でいいなら郵送用の紙への印刷もできなくはないでしょう。ソフトから見れば、FAXもプリンタも印刷なので。

の中の

<table><tbody><tr><td>1</td><td>your_name</td><tr><tbody></table>
をjavascriptで
<table><tbody><tr><form><td><input type="submit"/><input type="hidden" name="id"/></td><td><input type="text" name="name" value="your_name"/></td></form><tr><tbody></table>
と書き方らfirefoxでform以下のオブジェクトが表示されない件。
まあ、<form action="javascript:void(0);"><table>~</table></form>で回避しましたけど。。。
うーん、もう、なにがなんだか。。。