GitHubじゃ!Pythonじゃ!

GitHubからPython関係の優良リポジトリを探したかったのじゃー、でも英語は出来ないから日本語で読むのじゃー、英語社会世知辛いのじゃー

facebookincubator

xar – 実行可能なアーカイブ形式

投稿日:

実行可能なアーカイブ形式

XAR

XARを使用すると、多数のファイルを1つの独立した実行可能ファイルにパッケージ化できます。 これにより、配布とインストールが容易になります。

.xarファイルは読み込み専用のファイルシステムイメージで、マウントされると通常のディレクトリからユーザスペースプログラムのように見えます。 これには、このファイルシステム用のドライバ( SquashFS )を一度インストールする必要があります。

XARは “czar”(/t͡ʂar/)のように発音されます。 XARの ‘X’はFacebookのような他のすべての文字のプレースホルダーを意味する。このフォーマットはもともとはZIPベースのPAR(Pythonアーカイブ)、JSAR(JavaScriptアーカイブ)、LAR(Luaアーカイブ)などを置き換えるように設計されていた。

ユースケース

XARファイルには主に2つのユースケースがあります。 最初は、ファイルシステムのどこかに自動的にアトミックにマウントするためのいくつかのファイルを収集するだけです。 XARファイルを使用すると、それが保持するデータのディスク上のサイズが大幅に縮小されます。 元のサイズの20%以下に圧縮することは知られていません。 これにより、マシンごとに複数のギガバイトを節約し、ランダムなディスクIOを減らすことができます。 これは、フラッシュストレージを備えたマシンでは特に重要です。

2番目のユースケースは最初の拡張ですxarexecファイルを実行可能にし、 xarexecヘルパーを使用するxarexecで、XARは実行可能コードとそのデータの自己完結型パッケージになります。 一般的な例は、すべてのPythonソースコードファイル、ネイティブ共有ライブラリ、設定ファイル、その他のデータを含むPythonアプリケーションアーカイブです。

これにより、仮想化とPEXファイルを、より高速で、オーバーヘッドが少なく、より互換性があり、より良い圧縮を実現するシステムに置き換えることができます。 欠点は、マウントを実行するためにsetuidヘルパーが必要であるということです。

Pythonの使用のためのXARの利点

  • SquashFSは、ディスク上のPythonへの通常のファイルのように見えます。 これにより、CPythonでよりよくサポートされている正規のインポートを使用できます。

  • SquashFSはあなたのアプリケーションにも通常のファイルのように見えます。 パッケージ内のデータファイルにアクセスするために、 pkg_resourcesやその他の手口を使う必要はありません。

  • Zstandard圧縮によるSquashFSは、ZIPファイルと比較してもディスク容量を節約します。

  • SquashFSでは、 .soファイルをZIPファイルのように一時的な場所に解凍する必要はありません。

  • SquashFSは、ZIPファイルを展開するよりも早く起動できます。 ファイルシステムを一度マウントするだけで済みます。 その後のアプリケーション呼び出しは、既存のマウントを再利用します。

  • SquashFSは、アプリケーションで使用されているページを解凍するだけで、解凍されたページはページキャッシュにキャッシュされます。

  • SquashFSは読み取り専用であるため、アプリケーションの保全性はvirtualenvsを使用するか一時ディレクトリに展開するよりも保証されます。

ベンチマーク

パフォーマンスの最適化(スペースと実行時間の両方)は、XARの主要な設計目標でした。 オープンソースツールでベンチマークテストを実施し、PEX、XAR、およびネイティブインストールを以下のメトリックで比較しました。

  • サイズ:実行可能ファイルのファイルサイズ(バイト単位)
  • コールドスタート時間:何もマウントまたは抽出されていない時間
  • ホットスタート時間:キャッシュを抽出したとき、またはXARスカッシュをマウントしたときにかかる時間

PEXはpython3 setup.py bdist_pex --bdist-allでビルドされ、XARはpython3 setup.py bdist_xar --xar-compression-algorithm=zstdます。

コンソールスクリプト サイズ コールドスタート時間 ホットスタート時間
django-admin(ネイティブ) 22851072 B 0.220秒
django-admin.pex 8529089 B 1.705秒 0.772秒
django-admin.xar 5464064B(-36%) 0.141秒(-92%) 0.122秒(-84%)
黒(ネイティブ) 1020928 B 0.245秒
ブラック。ペックス 677550 B 0.737秒 0.619秒
black.xar 307200B(-55%) 0.245秒(-67%) 0.219秒(-65%)
ジュピター(ネイティブ) 64197120 B 0.399秒
jupyter.pex 17315669 B 2.152秒 1.046秒
jupyter.xar 17530880B(+ 1%) 0.213s(-90%) 0.181秒(-83%)

結果は、ファイルサイズ( zstd圧縮あり )と開始時間の両方がXARで向上することを示しています。 これは、多数のサーバー、特にWebサーバー上の小さなデータ収集スクリプトや対話的なコマンドラインツールなどの短期実行可能ファイルでの出荷時の改善です。

要件

XARの要件:

  • LinuxまたはmacOS
  • Python> = 2.7.11 &> = 3.5
  • squashfs- XARを構築するためのツール
  • squashfuse > = 0.1.102 squashfuse_ll squashfuse_llを実行する

XARのコンポーネント

bdist_xar

これは、Pythonアプリケーションを.xarファイルとしてパッケージ化できるsetuptoolsプラグインです。 それにはsquashfs-toolsが必要です。 PyPIからインストールして安定版を入手する:

pip install xar

または 、このリポジトリからインストールできます。

python setup.py install

インストール後、コンソールスクリプトを使用してPythonプロジェクトに行き、以下を実行してください:

python setup.py bdist_xar

setuptools拡張bdist_xarは、XARを設定するオプションがあります。最も重要なのは、– --interpreterは、使用されるPythonインタプリタを設定します。 python setup.py bdist_xar --helpを実行すると、オプションの完全なリストが表示されます。

xarexec_fuse

これは、SquashFSイメージをマウントするために使用されるC ++で書かれたバイナリです。 それはsquashfuseインストールされている必要があります。 Ubuntuの現在のsquashfuseパッケージにはsquashfuse_ll含まれていないので、 ソースからインストールする必要があります。

コードのこの部分は、次のように作成できます。

mkdir build && cd build && cmake .. && make && [sudo] make install

bdist_xar

単に実行する:

python /path/to/black/setup.py bdist_xar [--xar-compression-algorithm=zstd]
/path/to/black/dist/black.xar --help

make_xar

XARは、Python実行可能ファイルまたはディレクトリからXARを作成するための簡単なCLIを提供します。 PEXのような既存のPython実行可能zipファイルからXARを作成することができます。

make_xar --python black.pex --output black.xar

また、ディレクトリからXARを作成して、実行可能な実行可能ファイルをXARに指示することもできます。

> mkdir myxar
> echo -n "#\!/bin/sh\nshift\necho \$@" > myxar/echo
> chmod +x myxar/echo
> make_xar --raw myxar --raw-executable echo --output echo
> ./echo hello world
hello world

xarexec_fuseは、XARパスを最初の引数として使用して実行可能ファイルを実行し、その後にXARs引数を転送します。

Circle CIテストのローカル実行

まず、コードを実行する方法であるので、ドッカー(および可能なドッカー・マシン)をインストールする必要があります。 次に、 circleci cliをインストールして実行する必要があります

circleci build

.circleci/config.ymlを変更した場合は、コミットする前に検証する必要があります

circleci config validate

貢献する

助けになる方法については、CONTRIBUTINGファイルを参照してください。

ライセンス

XARはBSDライセンスです。







-facebookincubator

執筆者: