スキップしてメイン コンテンツに移動

投稿

2月, 2013の投稿を表示しています

Inside KyoroStress -1- Create Low Memory Killer situation on purpose!!

Android PF have kill alive process when heigher priority process need heap. This report explain that produce Low Memory Killer situation on purpose You think it so simple. just to make application to consume many heap. but, it difficult that your thinking way. following problem - A. Android PF restrict application java heap per one process. - B. heap comsuming application is killed by Android PF. This report introduce KyoroStress 's solution. [KyoroStress solution] Kyoro Stress done following approach. - 1. Booting many service in the process of differing respectively. - 2. Each Service consumes a lot of heaps. The problem of A is solved by booting many process, and B too, alive heap is more consume instead of kill service's heap [BigEater(consuming heap service) 's senario] - 1. consume the specified heap. if retry is true, then consuming heap is repeated repeatedly until the specified heap is consumed - 2. recovery killed ser…

KyoroStressの技術 -1- Low Memory Killer を意図的に発生させたい

[課題] Low Memory Killer を意図的に発生させたい Androidには、ヒープが涸渇すると使われていないアプリをKillする機能があります。 この記事では、意図的にヒープを枯渇させて、この状態をつくる方法について説明します。 単純にヒープを大量に消費するアプリを作成すれば良いように思えます。 しかし、これだけでは上手くいきません。   -A ひとつのアプリで消費できるヒープが制限されているため、ひとつのアプリで端末のヒープが涸渇している状態をつくれない。   -B ヒープを涸渇しているアプリがPFにKILLされる場合がある。 といった問題があります。 KyoroStressV2での解決方法を紹介します。 [KyoroStressでの解決方法] Kyoro Stress では、以下のような方法をとりました。 - 1. 複数のServiceを、各々異なるプロセスで起動する。 - 2. 各々Serviceで大量のヒープを消費する。 複数のプロセスを立ち上げれば、PFのヒープを枯渇させることができます。これで、(A)の問題が解決できました。 また、Bについては、「生きているプロセス」が「KILLされたプロセス」の分もヒープを消費すれば上手くいけそうです。 [BigEater(ヒープ消費サービス)の動作] KyoroStressV2で、ヒープを消費するサービスは以下のシナリオで動作しています。 - 1. 指定されたヒープを取得する。 is retry が true の時、指定されたヒープを取得できるまで、1を何度も繰り返す。 - 2. KILLされたサービスを復活させる。 is retry が true の時、Threadが死ぬまで、何度も2を繰り返す。 - 3. 終了 といった感じです。 このままでは、すべてのServiceがPFにKILLされたら上手くいかないように思うかも知れません。 しかし、時間がたつと(数秒)、PFはKILLしたServiceを再起動します。 このため、ServiceがすべてKILLされても、ヒープを大量に消費しようとする状態は保持されます。 [使い方] KyoroStressV2の操作方法…

KyoroText で使用されている技術 その12 AndroidでCoverageを計測したい

[課題] カバレッジを計測したい!! 基本、アプリ作成する時は、ユニットテスト(JUnitとか)を書きながら、コードを書いていきます。 動作確認しながらコードが書けるので作業がはかどります。 しかし、自分が書いたユニットテストが想定した通りのできか?うまくテストできているか? を確認するすべはありません。 どの程度テストできているかを定量的に客観的に数値化する方法があれば、 それらを確認するすべになります。※テスト作成のど忘れとした時に、気がつくことができます!! KyoroTextでしようとしている方法について解説します。 客観的なデータがあれば、うまく想定したとおりにテストできていることが保障できます。 保障できないにしても心の安心を得ることはできるでしょう。 [カバレッジ] どの程度テストができているかを計る方法として、カバレッジという表現があります。 まずは、AndroidでCoverageをとる方法について解説します。 #カバレッジとは何か? Coverageは、テストした時にどの程度の網羅性があるかを数値化します。 具体的には、「テストできたクラスはのどのくらい?」「テストできたメソッドはどのくらい?」 「テストできた行はどのくらい?」といった事を計測するのです。 例えば、以下のようなコードがあったとして public void test(int a) { if(a>10) { --A-- } else { --B-- } } aが、11の時だけテストしたとすると、50%のテストができたといえます。 aが、11の時と、aが10の時をテストした場合、100%のテストができたといえます。 このように、自分が書いたコードがテストとできているかを、客観的にあらわす事ができるのです。 これがCoverageです。 [EMMA] EMMAというツールを使うことで簡単にカバレッジをとる事ができます。 EMMAはJavaのクラスファイルを書き換えます。 すべてのif文の前後、メソッドの先頭等に、Coverageを測定するためのコードを埋め込みます。 EMMAは単純に、埋め込んだコード上で通過した部分を記録しておき。アプリが終了するタイミングで、そのデータ…

P2P探訪 Raider その1-2 Torrentファイルフォーマット

というわけで、前回に引き続いて、この記事ではTorrentファイルについて説明します。 [Torrent file format] 前回、Bencodingを実装したのでTorremt Fileを読み込めることができるようになりました。 今回は、Torrentファイルから必要な情報を読み込む方法について解説します。 torretファイルから取得できる情報はどんなものかは、別の機会に解説します。 ここでは、torrentファイルには 2つのフォーマットがあることとデータ構造を説明します。 たとえば、「"announce"というデータが何なのか?」については解説しません。 torrentファイルでは、ダウンロード/アップロードの対象としているファイルが、ひとつの場合と複数の場合で構造がすこしだけことなります。 ひとつの時を、「single file」 複数の時を「multi file」と呼ぶことにます。 では、データ構造を紹介します。 - single file pattern bendiction benstring "announce" beninteger "creation date" bendiction "info" beninteger "length" benstring "name" beninteger "piece length" bebstring "pieces" - multi file pattern bendiction benstring "announce" beninteger "creation date" bendiction "info" benlist "files" bendiction beninteger "length" benlist "path" benstring be…

P2P探訪 Raider その1-1 Bencoding

前回の記事を書き直しました。説明不足を補います。 課題1 Torrent File に記載されている情報を読み込みたい。 BitTorrent のプロトコルを学習するに当たって、実際に、Torrentクライアントを実装することにしました。 まず最初に、TorrentFileに記載されている情報を読み取ることから始めたいと思います。 Torrentファイルは、bencode というルールで、記述されています。 そこで、 1. Bencodingを扱えるようにする。 2. Bittorrentファイルを読み込めるようにする。 の順に問題を解決していくことにしました。 というわけで、この記事ではBencodingについて説明します。 Bencoding bencodingは integer, string(byte array), list, diction のデータ型を持ちます。 なので、この4つデータ型のデコードとエンコードができるようになれば、 bencodingを扱えるようになったことになります、 具体的に、以下のようなルールでエンコードされいます。 beninteger : "i" [0-9]* "e" benstring : [0-9]* ":" <bytes array/string>   # bytes array/string length is prev [0-9]*. bendiction : "d" dictelements "e" benlist : "l" listelements "e" benobject : beninteger | benstring | beniction | benlist listelements : benobject (benobject)* dictelements : benstring benobject (benstring benobject)* といった感じです。 例えば、 Integerで、1を表したい場合は、"i1e" Stringでab…

P2P探訪 Raider その1 Bittorrent File Format

[Raider Purpose] P2Pについて学習するために、Raiderというメタファーのgithubリポジトリを作成しました。 まずは、もっとも有名な Torrentプロトコルを実装してみようと思います。 私にとっては、BitTorrentの仕様書だけを頼りに実装するのは難しいことです。 そこで、Raiderでは、以下のアプローチとっています。 1. bittorrentについて、実現できそうなシナリオを作る。 2. 調査しながら、コードを書く 3. 評価して、次のシナリオを決める。  今は最初に実現しようとしているのは、以下のようなものです。   # torrentファイルの読み込みと作成をする。  これなら、簡単に実現できそうですね!! [Torrent file format] # bencoding Torrent file は bencoding によって構成されています。 まずは、bencoingを扱えるようにする必要があります。 bencodingは integer, string(byte array), list, diction で構成されています。 bencoding は以下のような簡単なルールでencodeされます。 beninteger : "i" [0-9]* "e" benstring : [0-9]* ":" # bytes array/string length is prev [0-9]*. bendiction : "d" dictelements "e" benlist : "l" listelements "e" benobject : beninteger | benstring | beniction | benlist listelements : benobject (benobject)* dictelements : benstring benobject (benstring benobject)* 簡単といえるのは、先頭1文字で、どのデータ構造でできているかが判断…