SlideShare a Scribd company logo
ASP.NET Core の
パフォーマンスを
支える
I/O Pipeline と
Channel
.NET Conf 2022 Recap Event 福岡
2022/11/25
株式会社オープンストリーム
ジョニー
@joni2nja
about:config
ジョニー
@joni2nja
https://joni.carrd.co/
https://medium.com/@joni2nja
https://github.com/jo-ninja
今日お話しすること
System.IO.Pipelines と
System.Threading.Channels の紹介
.NET 7 でのパフォーマンス改善
https://devblogs.microsoft.com/dotnet/performance_improvements_in_net_7/
PDF版:https://aka.ms/net7-perf-pdf
ASP.NET Core の パフォーマンス
Do more with less
より少ないリソース(資源や時間)で
より多くのことを実現する
System.IO.Pipelines
高性能な I/O をより簡単に行えるように
設計されたライブラリ
https://learn.microsoft.com/en-us/dotnet/standard/io/pipelines
どのような課題を解決するのか?(1/5)
データプロトコルのパース処理で、ストリームから byte 列を
読み込む典型的な例:
どのような課題を解決するのか?(2/5)
ほとんどのストリーム系
API は、データコピー
前提で設計されている。
例:
https://github.com/dotnet/runtime/blob/5c420f1aa78455c803f6d6b17eb4543ad728461c/src/libraries/System.Private.CoreLib/src/System/IO/MemoryStream.cs#L337-L344
どのような課題を解決するのか?(3/5)
⚠️ 1回の呼び出しで対象のデータ(例:EOL)を受信/読み込み
できない場合がある
💡EOLが見つかるまでバッファの確保・リサイズ等をする
⚠️ 1回の呼び出しで複数EOLが返ってくる場合もある
💡それぞれパース・処理する
どのような課題を解決するのか?(4/5)
⚠️ バッファ確保・リサイズ問題
⚠️頻繁にデータのコピーが発生
⚠️アロケート(割り当て)したメモリはコンパクト化されない
⚠️GCへの負担が増加
💡バッファの繰り返しアロケートを避ける
ために ArrayPool<byte> を使用し、処理終了後は
バッファをプールに返却する
💡一定サイズのバッファのリストを使用する
改善された(不完全)例:👉
サンプルはこちら:
https://learn.microsoft.com/en-us/dotnet/standard/io/pipelines
System.IO.Pipelines
System.IO.Pipelinesの目標は、これらの課題を解決したい、かつ
より簡単に書けるようにしたい
✅ストリーミングデータを高速にパースする。
✅コードの複雑さを軽減する
System.IO.Pipelines の場合
✅明示的にバッファをアロケート
する必要がない
✅バッファの管理はすべて
PipeReaderとPipeWriterに
任せる
✅ユーザコードは複雑な
バッファ管理ではなく、
ビジネスロジックに集中する
ことができる
Pipe
• Pipe クラスを使用し、 PipeWriter と PipeReader のペアを
作成することができる
• PipeWriter に書き込まれたすべてのデータは、PipeReader
で利用できる
PipeWriterで
書き込み
Pipe覗き見
• 実際に「consume」することなく、Pipe内のデータを覗き見る
ことができる
Pipe
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
1GBのデータを読み込もうとしても~
Segment が増えるだけで、LOHに配置されないのが有り難い😉
つまり
https://www.youtube.com/watch?v=1koWtKkKb_o - High performance IO with System.IO.Pipelines
https://www.youtube.com/watch?v=tLnQsNTfl9Q - .NET Design Review: System.IO.Pipelines
System.Threading.Channels
プロデューサーとコンシューマーの間で非同期に
データを転送するためのデータ構造。
Channel を使えば、独自に同期やロックを実装
する必要がなくなる。
https://learn.microsoft.com/en-us/dotnet/core/extensions/channels
プロデューサー/コンシューマー?🤔
System.IO.Pipelines と何が違う?
Pipelines 🆚 Channels
System.IO.Pipelines
• API も実装も、 byte 例を処
理するのに最適化されている
• 1プロデューサー:1コン
シューマー
System.Threading.Channels
• API も実装も、任意のデータ
をスレッド間で転送するため
に最適化されている
• 1..nプロデューサー:1..nコン
シューマー
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
BlockingCollectionと何が違う?
BlockingCollection involves blocking; there are no
task-based APIs to perform work asynchronously.
Channels is all about asynchrony; there are no
synchronously-blocking APIs — Stephen Toub.
Channel ファクトリ作成
Channel.CreateBounded<T>()
最大容量を指定した Channel
を作成する
Channel.CreateUnbounded<T>()
任意の数のプロデューサー/コ
ンシューマーが同時に使用でき
るチャネルを作成する
任意のデータ
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
例:データ変換→アップロード
System.IO.Pipelines
+
System.Threading.Channels
=
❓
例:データ変換→アップロード
System.IO.Pipelines
+
System.Threading.Channels
=
🚀
ご清聴ありがとうございました

More Related Content

PPTX
kubernetes初心者がKnative Lambda Runtime触ってみた(Kubernetes Novice Tokyo #13 発表資料)
PDF
インフラエンジニアの綺麗で優しい手順書の書き方
PDF
Entity Framework(Core)についての概要を学ぼう
PPTX
コンテナネットワーキング(CNI)最前線
PDF
コンテナの作り方「Dockerは裏方で何をしているのか?」
PPTX
KubernetesのRBACを掘り下げてみる(Kubernetes Novice Tokyo #17 発表資料)
PPTX
KeycloakでAPI認可に入門する
PDF
MapReduce/YARNの仕組みを知る
kubernetes初心者がKnative Lambda Runtime触ってみた(Kubernetes Novice Tokyo #13 発表資料)
インフラエンジニアの綺麗で優しい手順書の書き方
Entity Framework(Core)についての概要を学ぼう
コンテナネットワーキング(CNI)最前線
コンテナの作り方「Dockerは裏方で何をしているのか?」
KubernetesのRBACを掘り下げてみる(Kubernetes Novice Tokyo #17 発表資料)
KeycloakでAPI認可に入門する
MapReduce/YARNの仕組みを知る

What's hot (20)

PDF
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
PPTX
BuildKitによる高速でセキュアなイメージビルド
PDF
知っているようで知らないPAMのお話
PPTX
その Pod 突然落ちても大丈夫ですか!?(OCHaCafe5 #5 実験!カオスエンジニアリング 発表資料)
PDF
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
PDF
Topology Managerについて / Kubernetes Meetup Tokyo 50
PPTX
Openconfigを用いたネットワーク機器操作
PPTX
本当は恐ろしい分散システムの話
PPTX
C# 8.0 非同期ストリーム
PPTX
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
PPTX
Azure Functions with terraform
PPTX
NGINXをBFF (Backend for Frontend)として利用した話
PDF
NEDIA_SNIA_CXL_講演資料.pdf
PDF
分散トレーシング技術について(Open tracingやjaeger)
PPTX
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
PDF
NetflixにおけるPresto/Spark活用事例
PPTX
フロー技術によるネットワーク管理
PPTX
Apache BigtopによるHadoopエコシステムのパッケージング(Open Source Conference 2021 Online/Osaka...
PDF
AWSのログ管理ベストプラクティス
PPTX
大規模データ処理の定番OSS Hadoop / Spark 最新動向 - 2021秋 -(db tech showcase 2021 / ONLINE 発...
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
BuildKitによる高速でセキュアなイメージビルド
知っているようで知らないPAMのお話
その Pod 突然落ちても大丈夫ですか!?(OCHaCafe5 #5 実験!カオスエンジニアリング 発表資料)
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
Topology Managerについて / Kubernetes Meetup Tokyo 50
Openconfigを用いたネットワーク機器操作
本当は恐ろしい分散システムの話
C# 8.0 非同期ストリーム
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
Azure Functions with terraform
NGINXをBFF (Backend for Frontend)として利用した話
NEDIA_SNIA_CXL_講演資料.pdf
分散トレーシング技術について(Open tracingやjaeger)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
NetflixにおけるPresto/Spark活用事例
フロー技術によるネットワーク管理
Apache BigtopによるHadoopエコシステムのパッケージング(Open Source Conference 2021 Online/Osaka...
AWSのログ管理ベストプラクティス
大規模データ処理の定番OSS Hadoop / Spark 最新動向 - 2021秋 -(db tech showcase 2021 / ONLINE 発...
Ad

Similar to ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel (20)

PPTX
Windows Azure PHP Tips
PDF
ASP.NET 新時代に向けて ~ ASP.NET 5 / Visual Studio 2015 基礎解説
PDF
.NET アプリを改善して実践する継続的インテグレーション
PDF
コンテナーによるIT基盤変革 - IT infrastructure transformation -
PDF
ASP.NET vNext / Visual Studio "14" に見る .NET の未来像
PDF
【BS11】毎年訪れる .NET のメジャーバージョンアップに備えるために取り組めること
PDF
de:code 2019 Cloud トラック 総まとめ!
PDF
どっちの VS ショー / 伝統の Visual Studio 2019、人気の Visual Studio Code
PPTX
Speed Up Web 2012
PPT
Intalio会社概要とIntalio Bppの特長 010109
PDF
Tekton 入門
PDF
Application development with c#, .net 6, blazor web assembly, asp.net web api...
PDF
[TL04] .NET 15 周年の今こそ考えるクラウドネイティブ アプリケーションと .NET の活用
PDF
Linux & Mac OS でも動く! ~ オープンソース & クロスプラットフォーム .NET の歩き方 ~
PDF
Application development with c#, .net 6, blazor web assembly, asp.net web api...
PDF
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
PPTX
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
PDF
HTML5など社内勉強会 Vol.11 - High Performance Web and iOS 6 WebKit
PPT
EPUB3以降とReadium
PDF
.NET Core と Container, そして Azure Web Apps on Linux による Web アプリ開発最前線
Windows Azure PHP Tips
ASP.NET 新時代に向けて ~ ASP.NET 5 / Visual Studio 2015 基礎解説
.NET アプリを改善して実践する継続的インテグレーション
コンテナーによるIT基盤変革 - IT infrastructure transformation -
ASP.NET vNext / Visual Studio "14" に見る .NET の未来像
【BS11】毎年訪れる .NET のメジャーバージョンアップに備えるために取り組めること
de:code 2019 Cloud トラック 総まとめ!
どっちの VS ショー / 伝統の Visual Studio 2019、人気の Visual Studio Code
Speed Up Web 2012
Intalio会社概要とIntalio Bppの特長 010109
Tekton 入門
Application development with c#, .net 6, blazor web assembly, asp.net web api...
[TL04] .NET 15 周年の今こそ考えるクラウドネイティブ アプリケーションと .NET の活用
Linux & Mac OS でも動く! ~ オープンソース & クロスプラットフォーム .NET の歩き方 ~
Application development with c#, .net 6, blazor web assembly, asp.net web api...
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
HTML5など社内勉強会 Vol.11 - High Performance Web and iOS 6 WebKit
EPUB3以降とReadium
.NET Core と Container, そして Azure Web Apps on Linux による Web アプリ開発最前線
Ad

More from Joni (13)

PPTX
.NET Framework で ​C# 8って使える? ​YESとNO!
PPTX
.NET Core 3.0 で Blazor を使用した​フルスタック C# Web アプリ​の構築
PPTX
Fiddler 使ってますか?
PPTX
Fukuoka.NET Conf 2018: 挑み続ける!Dockerコンテナによる ASP.NET Core アプリケーション開発事例
PPTX
ASP.NET パフォーマンス改善
PPT
Introduction to .NET
PPT
Tips and Tricks of Developing .NET Application
PPT
Introduction to Html
PPT
C#
PPT
Asp #1
PPT
Introduction to ASP.NET
PPT
Asp #2
PPTX
ASP.NET MVCはNullReferenceExceptionを潰している件
.NET Framework で ​C# 8って使える? ​YESとNO!
.NET Core 3.0 で Blazor を使用した​フルスタック C# Web アプリ​の構築
Fiddler 使ってますか?
Fukuoka.NET Conf 2018: 挑み続ける!Dockerコンテナによる ASP.NET Core アプリケーション開発事例
ASP.NET パフォーマンス改善
Introduction to .NET
Tips and Tricks of Developing .NET Application
Introduction to Html
C#
Asp #1
Introduction to ASP.NET
Asp #2
ASP.NET MVCはNullReferenceExceptionを潰している件

ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel