Skip navigation

オンプレミスからクラウドストレージ(オブジェクトストレージ)へのアップロード、ダウンロード性能を見積もることはなかなか難しいですよね。

 

  • 対象ファイルサイズは小さいのか、大きいのか?
  • ファイル数は?
  • サーバーのNICの帯域はどれくらいあるのか?
  • サーバーの上位スイッチはどの程度の帯域があるのか?
  • 契約しているインターネット回線の帯域はどの程度なのか?
  • そもそもクラウドベンダーのオブジェクトストレージサービスってどの程度の性能がでるんだろ?

 

など、ぱっと思いつくだけでもいろいろと考えなければいけないなぁという感じです。上記ほとんどが、そのときそのときの状況によって変わってくるので事前に性能テストをしてもあまり意味がなさそうです。ただ、「そもそもクラウドベンダーのオブジェクトストレージサービスってどの程度の性能がでるんだろ?」は事前のテストデータは参考になりそうです。なので簡単な性能測定をしてみようと思います。

 

テスト概要

オラクルクラウド内に作成したComputeインスタンスからオブジェクトストレージにラージファイルをアップロードダウンロードした際のスループットを計測。つまりインターネット回線のボトルネックの影響を気にせず純粋にオブジェクトストレージの性能(特にスループット)を計測してみます。

 

環境情報

以下のような環境でテストしてみました。リージョンはPhoenixです。

 

スペック的には以下のようになっており、特筆すべきは、物理コア52コア104スレッド、かつNICは25Gbpsという大規模なベアメタルのインスタンスでオブジェクトストレージに負荷をかけいく点です。NICの限界までスループットが伸びればいいなぁという思いがあります。

 

  • Computeインスタンス:BM.Standard2.52
    • CPU : 52コア(104スレッド)
    • メモリ : 768 GB
    • NIC : 25 Gbps
  • Bucket : Standard Bucket

 

単一ラージファイルのアップロードとダウンロード性能

まずはラージファイル一つをアップロード、ダウンロードしてみます。

1GBのラージファイルをメモリ上(/dev/shm)に作り、これをアップロード、ダウンロード用のテストデータにします。ストレージ上にテストデータを作ると、ストレージIOまで考慮しなければならず面倒です。一般的なシステムですと、ストレージIOよりもネットワークIOが速くなる構成はあまりありませんが、今回は何といっても25 GbpsのNICを搭載しているインスタンスを使いますのでストレージIOに引っ張られないようにメモリにテストデータを置きます。パフォーマンスログもストレージIOを見る必要がなくなるので一石二鳥です。

 

アップロード、ダウンロードはocicliというoracle cloud用のツールを使います。ocicliとはなんだろ?という方はこちら

下記のようなコマンドでアップロードしてゆきます。コマンドの簡単な説明としては、-nsでテナント名を指定、-bnでバケット名を指定、--fileでアップロード対象のファイルを指定という感じです。このコマンドはマルチパートアップロードとなり、下記ログからわかるように1GBのラージファイルを8つのパーツに分けて並列アップロードを行います。

 

$ oci os object put -ns OracleSonoda -bn SonodaBucket --file /dev/shm/data_1GB

Upload ID: b6156b09-7eb4-ae1c-617b-9c9bd3a5a37d

Split file into 8 parts for upload.

Uploading object  [####################################]  100%

{

  "etag": "fac242b7-28ca-429b-9a10-de1eb5835d2a",

  "last-modified": "Wed, 27 Feb 2019 06:40:08 GMT",

  "opc-multipart-md5": "KKRDS43OuPhjAwVlwXJM+A==-8"

}

 

ダウンロードは以下のように実行します。アップロード違う点は、--nameでオブジェクトストレージ上のオブジェクト名を指定し、--fileでダウンロードしたときにつけるファイル名を指定するところくらいです。

 

$ oci os object get -ns OracleSonoda -bn SonodaBucket --name data_1GB --file /dev/shm/down_1GB

Downloading object  [####################################]  100%

 

結果としては以下のようなグラフになりました。まあ、こんなもんでしょうか。スループットとしてはアップロード時、ピークで80MB/s、ダウンロード時、ピークで40MB/sしか出ていません。CPUの使用率も1.5%以下と非常に低い。予想通り、負荷が低すぎて、スループットはあまり伸びないですね。

 

アップロードの結果

 

ダウンロードの結果

 

 

複数ラージファイルのアップロードとダウンロード性能

せっかく25 GbpsのNICがついているインスタンスなので、これで終わってはもったいない。もっと負荷を上げていきたいと思います。NICの限界が先か、オブジェクトストレージサービスの限界が先か。

 

負荷を上げるアプローチは単純です。要は複数ファイルを同時並行でアップロードすればよいだけ。本来はmulti processingのライブラリを使って行儀よくやったほうがいいのですが、少し面倒ですね。。。しょうがない、アレをやります。。。クイック・パラレル・プロセッシング!(ただ単にアップロードコマンドに「&」をつけてfor文でブン回すだけ。)

 

ということでメモリ上に1GBのファイルをとりあえず50個作りました。

↓こんな感じ。

for i in `seq 1 50`; do

dd if=/dev/zero of=/dev/shm/data/data_1GB_${i} bs=1G count=1

done

 

で、この1GB x50個のファイルを50多重で一気にアップロードします。

↓こんな感じ。

for i in `seq 1 50`; do

oci os object put -ns OracleSonoda -bn SonodaBucket --file /dev/shm/data/data_1GB_${i} &

done

 

当然、ダウンロードも50多重で一気にダウンロード。

↓こんな感じ。

 

for i in `seq 1 50`; do

oci os object get -ns OracleSonoda -bn SonodaBucket --name data_1GB_${i} --file /dev/shm/data/down_1GB_${i} &

done

 

で、結果のグラフがこちら。

アップロードはピーク時、約3GB/sec(=約24Gbps)も出ました。CPU使用率もだいぶ上がりました。

 

 

ダウンロードもピーク時、約2.5GB/sec(=約20Gpbs)まで上がりました。

 

 

しかし、クラウドって本当に便利ですね。。。簡単なテストとは言えオンプレミスでテストしようとするとそれなりに手間と時間がかかりますが、クラウドだとわずか30分足らずで完了です。

 

考察

  • 今回のテストケース(ラージファイル50多重)ではオブジェクトストレージはボトルネックとならず、NICの限界性能に近い値がでているといっていいと思います。
    • アップロードに関しては25Gbps NICに対して24Gbpsと95%も帯域を使えている
    • ダウンロードに関しては25Gbps NICに対して20Gbpsと80%の帯域を使えている
  • ダウンロードに関してはもうちょっとでてもいいかなと思います。おそらくファイル数がもっと多くて同時ダウンロード数が多い場合はスループットがもっと伸びるのだろうと思います。
  • つまり、この程度ではオブジェクトストレージがボトルネックになることはないということがわかりました。
  • 今回は一つのインスタンスから負荷をかけましたが、複数インスタンスから同時に負荷をかけるともっとスループットが伸びそうですね。(また機会がありましたら実施したいと思います。)

 

しかし、CPUを使い切ってくれるツールってなかなかないですよね。。。

どなたかいいツールをご存知でしたらコメント欄で教えていただけると幸甚です。。。

 

最後に、賢明な読者の方々にはご理解いただいていると思いますが、上記は参考値ですのでくれぐれもこの値をベースに実システムのサイジングをすることは避けてくださいね。

こんにちは、OCI BD 近藤です。

 

昨年末に秋葉原で第十八回PCクラスタシンポジウムが開催されました。

そこで、「実用アプリケーション部会報告 OpenFOAMによる流体解析ベンチマークテスト」にて、Oracle Cloud Infrastructure(OCI)の新しいHPCインスタンス(BM.HPC2.36)ベンチマーク結果についても発表いただきました。

 

今回のベンチマークでは、OCIのHPCインスタンスは概ね16ノードまでスケールし、他のInfinibandを使用したオンプレミスHPCクラスタに近い、非常に高い性能を達成しています。
これは、OCi HPCインスタンスの100Gbps + RDMA(RoCE v2)による程遅延のインターコネクトや、最新のIntelのCPUの性能が発揮された結果だと考えれます。

また、今回のベンチマーク結果に含まれているPublic Cloudの中では、一番良いパフォーマンスを実現していますので、ぜひ発表資料をご覧下さい。

(https://www.pccluster.org/ja/event/2018/12/pcccSymp18_imano.pdf?191214)

 

 

Oracle Cloud Infrastructure HPCインスタンス(BM.HPC2.36)について:

BM.HPC2.36は、最新のCPU、RDMA(RoCE v2)ネットワークを採用したベアメタル・サーバーにより、オンプレミス同等の高い性能を実現しています。

それでいて $0.07(1CPUコア、時間)と価格を抑えているため、非常に高い価格性能比となっています。

 

今までクラウドではパフォーマンスが出なくて実行が難しかったHPCアプリケーションも、OCIの新しいHPCインスタンスであれば、オンプレミス同等の高いパフォーマンスが期待できます。ぜひ一度試してみて下さい。

 

BM.HPC2.36 仕様:

  • 価格: ¥9.0(1CPUコア、時間)
  • CPU: 36コア、 Skylake 3.0GHz - 3.7GHz(Turbo Boost)
  • Memory:  384 GB
  • ネットワーク: 100Gbps RDMA(RoCE v2) x 1、  25Gbps  x 1
  • ローカル・ディスク: 6.7 TB NVMe
    (追加で、リモート・ブロック・ボリュームおよびNFSボリュームが使用可能)

@本記事ではOracle Cloud InfrastructureのSDKについてクイックにご紹介したいと思います。OCIではJava、Python、Ruby、Goといった言語のSDKが利用できますが、その中でも比較的人気のPython SDKを使って簡単なコードを動かしてみたいと思います。マニュアルとしては「Software Development Kits and Command Line Interface」になります。

 

作業ステップ

作業としては下記4ステップです。

 

1. Pythonのインストール

2. ocicliのインストールとセットアップ

3. Python SDKのインストール

4. Python SDKで「Hello, World!」

 

※IAMユーザー、グループ、オブジェクトストレージに対するIAMポリシーは既に作成済という前提で書いていきたいと思います。

 

1)Pythonのインストール

何はともあれPythonをインストールします。(古いバージョンをインストールしてしまいました。今だと3.xをインストールされたほうがいいですね。)

[opc@bm1 ~]$ sudo yum install gcc libffi-devel python-devel openssl-devel

Loaded plugins: langpacks, ulninfo

Resolving Dependencies

--> Running transaction check

.......

.......

.......

Complete!

 

[opc@bm1 ~]$ python --version

Python 2.7.5

 

これでPythonのインストールが完了しました。続いてpipをインストールします。

 

[opc@bm1 ~]$ sudo easy_install pip

Searching for pip

Reading https://pypi.python.org/simple/pip/

Best match: pip 19.0.2

.......

.......

.......

Installed /usr/lib/python2.7/site-packages/pip-19.0.2-py2.7.egg

Processing dependencies for pip

Finished processing dependencies for pip

 

[opc@bm1 ~]$ pip --version

pip 19.0.2 from /usr/lib/python2.7/site-packages/pip-19.0.2-py2.7.egg/pip (python 2.7)

 

これでpipのインストールが完了しました。続いて、virtualenvをインストールします。virtualenvは必須ではありませんが何かと便利ですのでマニュアル通りインストールしたいと思います。

 

[opc@bm1 ~]$ sudo pip install virtualenv

Collecting virtualenv

.......

.......

Installing collected packages: virtualenv

Successfully installed virtualenv-16.4.0

 

で、仮想環境を作成してゆきます。今回はsdk_testという名前の仮想環境を作成しました。

 

[opc@bm1 ~]$ virtualenv sdk_test

New python executable in /home/opc/sdk_test/bin/python

Installing setuptools, pip, wheel...

done.

[opc@bm1 ~]$ ls

bin  lib  sdk_test

[opc@bm1 ~]$ source sdk_test/bin/activate

(sdk_test) [opc@bm1 ~]$

 

2)ocicliのインストール、セットアップ

続いて、ocicliをインストールします。ocicliはociの各種サービスのプロビジョニングや管理操作などを簡素化されたコマンドで実行するためのCLIツールです。REST APIをPythonでラップしたツールです。SDKを使う上で必須ではありませんが、何かと便利ですのでインストールします。ocicliについてはこちらに詳細なチュートリアルがありますので是非参考にされてください。

 

まずはocicliをインストールしてゆきます。

(sdk_test) [opc@bm1 ~]$ pip install oci

Collecting oci

  Downloading https://files.pythonhosted.org/packages/8f/c0/3c4b6c60ed8aa88b5084a7a3e77c4d2ff1647e76425799b6258b081ce681/oci-2.1.7-py2.py3-none-any.whl (1.7MB)

.......

.......

Installing collected packages: configparser, enum34, asn1crypto, pycparser, cffi, six, ipaddress, cryptography, pyOpenSSL, pytz, python-dateutil, certifi, oci

Successfully installed asn1crypto-0.24.0 certifi-2018.11.29 cffi-1.12.1 configparser-3.7.1 cryptography-2.5 enum34-1.1.6 ipaddress-1.0.22 oci-2.1.7 pyOpenSSL-19.0.0 pycparser-2.19 python-dateutil-2.7.3 pytz-2018.9 six-1.12.0

これで、ocicliのインストール完了です。

 

ocicliはインストール後、セットアップを実行する必要があります。ocicliに、利用するテナント、IAMユーザー、認証情報など各種情報を設定してゆきます。これらの情報はデフォルトで ~/.oci/config に保存され、ocicliはコマンド実行時にこの情報を使って、OCIに接続し処理を実行します。ocicliだけでなく、SDKもこの config ファイルを利用します。ocicliをインストールせずにSDKだけ使う場合は config ファイルを自分で作成して必要なエントリを記載すれば大丈夫です。

 

では、ocicliのセットアップです。★の部分は簡単な説明です。

[opc@bm1 ~]$ oci setup config

    This command provides a walkthrough of creating a valid CLI config file.

    The following links explain where to find the information required by this

    script:

 

    User OCID and Tenancy OCID:

        https://docs.us-phoenix-1.oraclecloud.com/Content/API/Concepts/apisigningkey.htm#Other

    Region:

        https://docs.us-phoenix-1.oraclecloud.com/Content/General/Concepts/regions.htm

    General config documentation:

        https://docs.us-phoenix-1.oraclecloud.com/Content/API/Concepts/sdkconfig.htm

 

Enter a location for your config [/home/opc/.oci/config]:   ★これが構成ファイル。このファイルに下記入力情報が保存されます

Enter a user OCID: ocid1.user.oc1..aaaaaaaazxunrppwxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ★IAMユーザーのOCID。つまり内部的にこのユーザーを使ってOCIに接続しているということですね。

Enter a tenancy OCID: ocid1.tenancy.oc1..aaaaaaaa2hosiu47uxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ★接続対象のテナント

Enter a region (e.g. ca-toronto-1, eu-frankfurt-1, uk-london-1, us-ashburn-1, us-phoenix-1): us-phoenix-1 ★接続対象のリージョン

Do you want to generate a new RSA key pair? (If you decline you will be asked to supply the path to an existing key.) [Y/n]:  ★すでにRSAキーペアを作成済の場合はnを選んでください。

Enter a directory for your keys to be created [/home/opc/.oci]: ★このディレクトリにRSAキーファイルが作成されます。

Enter a name for your key [oci_api_key]:

Public key written to: /home/opc/.oci/oci_api_key_public.pem ★公開鍵のファイル

Enter a passphrase for your private key (empty for no passphrase): ★テストなのでパスフレーズなしでいきます。

Private key written to: /home/opc/.oci/oci_api_key.pem ★秘密鍵のファイル

Fingerprint: 1f:ca:22:4d:d4:e8:ac:ff:04:XX:XX:XX:XX:XX:XX:XX

Config written to /home/opc/.oci/config ★configファイルに上記入力項目が保存されます。

 

    If you haven't already uploaded your public key through the console,

    follow the instructions on the page linked below in the section 'How to

    upload the public key':

 

        https://docs.us-phoenix-1.oraclecloud.com/Content/API/Concepts/apisigningkey.htm#How2

 

[opc@bm1 ~]$ ls ~/.oci

config  oci_api_key.pem  oci_api_key_public.pem

 

 

~/.ociディレクトリの配下に鍵ファイルとconfigファイルができていることがわかります。

[opc@bm1 ~]$ ls ~/.oci

config  oci_api_key.pem  oci_api_key_public.pem

 

 

続いて、ocicliのセットアップで作成した鍵ペアの公開鍵をOCIにAPI Keyとして登録します。これによりocicliやSDKで処理を実行した際に、内部的に利用されるIAMユーザが認証されます。

 

まずは公開鍵ファイルの内容をコピー。

[opc@bm1 ~]$ cat ~/.oci/oci_api_key_public.pem

-----BEGIN PUBLIC KEY-----

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3sBjUdtOKH8xFyNZEShj

nVE9Gs3HtTsChRAggLlR1mjMXnyhBL/PFIdW5t36aoYvdOBOBkzd8BYlj3wbVk0M

OPYZoUdp+2Rb8hFFW3dy31OdQY6ohbgviFNLVT5w0d9lgwYljnz8fPACEqjacsbv

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

-----END PUBLIC KEY-----

 

コピーした鍵を下記のようにCloud Consoleのテキストフィールドにペーストして登録完了です。

これでocicliが使えるようになりました。参考までにocicliセットアップ時に作成されるconfigファイルの内容が下記です。入力した値がそのまま記載されていますね。

 

[opc@bm1 ~]$ cat ~/.oci/config

[DEFAULT]

user=ocid1.user.oc1..aaaaaaaazxunrppwodigwwrp2xxrgkgxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

fingerprint=1f:ca:22:4d:d4:e8:ac:ff:04:XXXXXXXXXXXXXXx

key_file=/home/opc/.oci/oci_api_key.pem

tenancy=ocid1.tenancy.oc1..aaaaaaaa2hosiu47uvjircmwi5y7vxxxxxxxxxxxxxxxxxxxxxxxxx

region=us-phoenix-1

 

 

3)Python SDKのインストール

続いて、やっとpython sdkのインストールです。githubにはoracle cloud infrastructure の公式リポジトリがあります。その中にoci-python-sdkというリポジトリがありますのでここからPython SDKのzipファイルをダウンロードします。

 

Python SDKのリポジトリ

このリポジトリのoci-python-sdk-2.1.7.zipをダウンロードします。ブラウザからでもいいですし、wgetでダウロードしていただいてもかまいません。

(sdk_test) [opc@bm1 ~]$ wget https://github.com/oracle/oci-python-sdk/releases/download/v2.1.7/oci-python-sdk-2.1.7.zip

--2019-02-19 03:52:36--  https://github.com/oracle/oci-python-sdk/releases/download/v2.1.7/oci-python-sdk-2.1.7.zip

.....

....

Length: 8032073 (7.7M) [application/octet-stream]

Saving to: ‘oci-python-sdk-2.1.7.zip’

100%[=======================================================================>] 8,032,073   18.0MB/s   in 0.4s

2019-02-19 03:52:37 (18.0 MB/s) - ‘oci-python-sdk-2.1.7.zip’ saved [8032073/8032073]

 

ダウンロードが完了しました。

 

続いて、ダウロードしたzipファイルを解凍します。

(sdk_test) [opc@bm1 ~]$ unzip oci-python-sdk-2.1.7.zip

 

解凍すると下記のようにoci-python-sdkというディレクトリができあがります。

(sdk_test) [opc@bm1 ~]$ ls

bin  lib  oci-python-sdk  oci-python-sdk-2.1.7.zip  sdk_test

 

oci-python-sdkに移動すると、oci-2.1.7-py2.py3-none-any.whlファイルがあります。

(sdk_test) [opc@bm1 oci-python-sdk]$ ls

CHANGELOG.rst  docs  examples  LICENSE.txt  oci-2.1.7-py2.py3-none-any.whl

 

Python SDKをインストールしてゆきます。

(sdk_test) [opc@bm1 oci-python-sdk]$ pip install oci-*-py2.py3-none-any.whl

.......

.......

インストール完了です。

これでやっとOCI Python SDKが利用可能な状態になりました。

 

4)Python SDKで「Hello, World!」をやってみる

なにごとも「Hello, World!」から。今回はマニュアルにあるHello Worldのサンプルコードをそのまま実行してみたいと思います。実行している内容としては「OCIオブジェクトストレージにバケットを作成し、そこに「Hello, World!」という文字列が入ったオブジェクトを作成する」というものです。

 

まずはPythonのインタラクティブモードに入ります。

(sdktest) [opc@mgmt sdktest]$ python

Python 2.7.5 (default, Nov  1 2018, 03:12:47)

[GCC 4.8.5 20150623 (Red Hat 4.8.5-36.0.1)] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>>

インタラクティブモードに入りました。

 

下記のように、作成されたconfigファイルを読み込みます。これにより、configファイル内に設定されているテナント、IAMユーザー、認証情報などが定義されるわけですね。さらにコンパートメント情報を定義します。

>>> import oci

>>> from oci.config import from_file

>>> config = from_file()

>>> compartment_id = config["tenancy"]

 

続いて、オブジェクトストレージにバケットを作成します。プロビジョニング系の処理は、やはりterraformやocicliのほうがクイックで分かりやすいですが、せっかくなのでSDKを使って作ってみたいと思います。オブジェクトストレージの操作は主にoci.object_storageクラスを利用し、バケットを作成するメソッドはcreate_bucket()になります。

 

>>> object_storage = oci.object_storage.ObjectStorageClient(config)

>>> namespace = object_storage.get_namespace().data

>>> from oci.object_storage.models import CreateBucketDetails

>>> request = CreateBucketDetails()

>>> request.compartment_id = compartment_id

>>> request.name = "MyTestBucket"

>>> bucket = object_storage.create_bucket(namespace, request) ★ここでバケットが作成される

>>> bucket.data.etag

u'998ea6ec-15b1-475d-9095-bc8b31634769'

これで「MyTestBucket」が作成されました。

 

Cloud Consoleから確認してみましょう。できてますね。しっかりと。MyTestBucketが。

そしてこのBucketに「Hello, World!」の文字列を入れたオブジェクトを書き込みます。書き込む際はput_object()メソッドを使います。

>>> my_data = b"Hello, World!"

>>> obj = object_storage.put_object(

... namespace,

... bucket.data.name,

... "my-object-name",

... my_data)

 

こちらもCloud Consoleから確認してみましょう。Bucketの中をみてみると、、、ありました!my-object-nameという名前のオブジェクトが作成されています。

念のためダウンロードして中身を確認します。メニューからDownloadを選択。

ダウンロードしたファイルをメモ帳で開いてみると、「Hello, World!」の文字列がちゃんとあります。

以上、非常に簡単ですがPython SDKの実行例でした。こちらがAPIリファレンスになりますのでどんなメソッドがあるのか詳細にお知りになりたい方は是非ご参照ください。

 

では、よいクラウドライフを!

皆様、こんにちは!

 

AnalyticsSC高橋です。

 

Analytics Cloud(通称OAC)105.1.0がリリースされました。

Desktop版もバージョンアップされており、

もう既に新しい環境にアップデートされてお使いの方もいらっしゃると思います。

 

アップデートの内容は、3月5日のパートナー様向けアップデート情報共有の場で、

詳しくご紹介させていただきますが、

今回は既存環境からの移行を、より楽にする機能拡充がメインとなります。

 

■Oracle Analytics Cloud v105.1.0 What's New

https://docs.oracle.com/en/cloud/paas/analytics-cloud/acswn/index.html#ACSWN-GUID-CFF90F44-BCEB-49EE-B40B-8D040F02D476

 

※アップデートセミナー後、順次このブログに新機能コンテンツをアップさせていただく予定です。