windows azure storage client 2.1 のbuffer pooling

11

Click here to load reader

Upload: takekazu-omi

Post on 10-May-2015

730 views

Category:

Technology


1 download

DESCRIPTION

Azure日本DC前夜祭!★Japan Windows Azure User Group 3周年 LT資料

TRANSCRIPT

Page 1: Windows Azure Storage Client 2.1 のBuffer Pooling

Windows Azure Storage Client 2.1

kyrt Takekazu Omi

[email protected]

@takekazuomi

2013/9/5 R.2

http://www.slideshare.net/takekazuomi/20130907-jazug-scl21whatsnew

Page 2: Windows Azure Storage Client 2.1 のBuffer Pooling

BUILD 2013 3-541 Windows Azure Storage: What’s Coming, Best Practices, and Internals

•劇的なパフォーマンスの向上!

2013/8/29 kyrt @takekazuomi 2

Page 3: Windows Azure Storage Client 2.1 のBuffer Pooling

Windows Azure Storage 2.1 Released

• nuget 9/4• Windows Azure Storage 2.1.0.0

• http://www.nuget.org/packages/WindowsAzure.Storage/

• azure storage tream blob (さっき)• Announcing Storage Client Library 2.1 RTM & CTP for Windows Phone

• http://blogs.msdn.com/b/windowsazurestorage/archive/2013/09/07/announcing-storage-client-library-2-1-rtm.aspx

• github (・・・)• https://github.com/WindowsAzure/azure-sdk-for-net

2013/8/29 kyrt @takekazuomi 3

Page 4: Windows Azure Storage Client 2.1 のBuffer Pooling

2.1 .NET Library : Performance Improvements

2013/8/29 kyrt @takekazuomi 4

1. Buffer Pooling

2. Multi-Buffer Memory Stream

長さが分からないデータのバッファリングでの一貫したパフォーマンスを実装

3. .NET MD5 (native 実装に比べて~20% 程度の高速化)

http://msdn.microsoft.com/en-us/library/windows/desktop/aa379947(v=vs.85).aspx

• nugetで配布中

http://www.nuget.org/packages/WindowsAzure.Storage/

https://github.com/WindowsAzure/azure-sdk-for-net/tree/dev

Page 5: Windows Azure Storage Client 2.1 のBuffer Pooling

Buffer Pooling

• Buffer Poolingは、確保済みbufferを複数のオペレーションで再利用するため、高いスケールを要求されるアプリケーションでは効果がある

• 特に、.NETのようなmanaged environment ではオブジェクトの確保と解放後のGCのかかるCPUコストを劇的に削減できる

• 2.1では、IBufferManager経由でPoolからBufferを取得する仕組みを組み込んだ

• CloudTableClient.BufferManagerに設定したものが使われる(BlobとQueueも)

public interface IBufferManager

{

// poolにバッファーを返す

void ReturnBuffer(byte[] buffer);

// poolからバッファを取得

byte[] TakeBuffer(int bufferSize);

// デフォルトのバッファーサイズを取得

int GetDefaultBufferSize();

}

2013/8/29 kyrt @takekazuomi 5

Page 6: Windows Azure Storage Client 2.1 のBuffer Pooling

CloudTableClient and BufferPool

2013/8/29 kyrt @takekazuomi 6

Buffer Pool

buffer

buffer

buffer

buffer

aCloudTableClient

TakeBufferReturnBuffer

Buffer Pool

buffer

buffer

buffer

buffer

aCloudTableClient

TakeBufferReturnBuffer

Page 7: Windows Azure Storage Client 2.1 のBuffer Pooling

Multi-Buffer Memory Stream

2013/8/29 kyrt @takekazuomi 7

MultiBufferMemoryStream : Stream

buffer buffer buffer buffer

Buffer Pool

buffer

buffer

buffer

buffer

aCloudTableClient

TakeBuffer

ReturnBuffer

buffer

Page 8: Windows Azure Storage Client 2.1 のBuffer Pooling

2013/8/29 kyrt @takekazuomi 8

IBufferManagerの実装が無い

Page 9: Windows Azure Storage Client 2.1 のBuffer Pooling

どうやら

• IBufferManager は、 System.ServiceModel.dllのBufferManager のパターンに従っているので、 desktop clientsはframeworkで用意された既存の実装を容易に利用することができます

• http://blogs.msdn.com/b/windowsazurestorage/archive/2013/07/12/introducing-storage-client-library-2-1-rc-for-net-and-windows-phone-8.aspx

インターフェイスだけ合わせれば行けそう

2013/8/29 kyrt @takekazuomi 9

Page 10: Windows Azure Storage Client 2.1 のBuffer Pooling

MyBufferManager

• System.ServiceModel.dllのBufferManager に丸投げ

• IBufferManagerのInterfaceに合わせただけ

• 微妙なのは、GetDefaultBufferSize()

maxBufferSizeが、DefaultBufferSize ?

• 現行コードをCheck• https://github.com/WindowsAz

ure/azure-sdk-for-net/blob/dev/microsoft-azure-api/Services/Storage/Lib/Common/Core/MultiBufferMemoryStream.cs#L89

class MyBufferManager:IBufferManager

{

private readonly BufferManager _buferManager = null;

private readonly int _maxBufferSize;

public MyBufferManager(long maxBufferPoolSize, int maxBufferSize) {

_maxBufferSize = maxBufferSize;

_buferManager = BufferManager.CreateBufferManager(maxBufferPoolSize, maxBufferSize);

}

public void ReturnBuffer(byte[] buffer) {

_buferManager.ReturnBuffer(buffer);

}

public byte[] TakeBuffer(int bufferSize) {

return _buferManager.TakeBuffer(bufferSize);

}

public int GetDefaultBufferSize() {

return _maxBufferSize;

}

}

2013/8/29 kyrt @takekazuomi 10

Page 11: Windows Azure Storage Client 2.1 のBuffer Pooling

2013/8/29 kyrt @takekazuomi 11