windows azure storage client 2.1 のbuffer pooling
DESCRIPTION
Azure日本DC前夜祭!★Japan Windows Azure User Group 3周年 LT資料TRANSCRIPT
Windows Azure Storage Client 2.1
kyrt Takekazu Omi
@takekazuomi
2013/9/5 R.2
http://www.slideshare.net/takekazuomi/20130907-jazug-scl21whatsnew
BUILD 2013 3-541 Windows Azure Storage: What’s Coming, Best Practices, and Internals
•劇的なパフォーマンスの向上!
2013/8/29 kyrt @takekazuomi 2
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
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
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
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
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
2013/8/29 kyrt @takekazuomi 8
IBufferManagerの実装が無い
どうやら
• 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
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
2013/8/29 kyrt @takekazuomi 11
終