SlideShare une entreprise Scribd logo
1  sur  47
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
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コン
シューマー
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>()
任意の数のプロデューサー/コ
ンシューマーが同時に使用でき
るチャネルを作成する
任意のデータ
例:データ変換→アップロード
System.IO.Pipelines
+
System.Threading.Channels
=
❓
例:データ変換→アップロード
System.IO.Pipelines
+
System.Threading.Channels
=
🚀
ご清聴ありがとうございました

Contenu connexe

Tendances

日本語テストメソッドについて
日本語テストメソッドについて日本語テストメソッドについて
日本語テストメソッドについて
kumake
 
HttpClient詳解、或いは非同期の落とし穴について
HttpClient詳解、或いは非同期の落とし穴についてHttpClient詳解、或いは非同期の落とし穴について
HttpClient詳解、或いは非同期の落とし穴について
Yoshifumi Kawai
 

Tendances (20)

今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
 
SpringBootにおけるテンプレートエンジンの活用
SpringBootにおけるテンプレートエンジンの活用SpringBootにおけるテンプレートエンジンの活用
SpringBootにおけるテンプレートエンジンの活用
 
日本語テストメソッドについて
日本語テストメソッドについて日本語テストメソッドについて
日本語テストメソッドについて
 
20170525 jsug バッチは地味だが役に立つ
20170525 jsug バッチは地味だが役に立つ20170525 jsug バッチは地味だが役に立つ
20170525 jsug バッチは地味だが役に立つ
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
 
perfを使ったPostgreSQLの解析(前編)
perfを使ったPostgreSQLの解析(前編)perfを使ったPostgreSQLの解析(前編)
perfを使ったPostgreSQLの解析(前編)
 
Python 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそうPython 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそう
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
 
M3の医療webサービス群を支える基盤技術
M3の医療webサービス群を支える基盤技術M3の医療webサービス群を支える基盤技術
M3の医療webサービス群を支える基盤技術
 
HttpClient詳解、或いは非同期の落とし穴について
HttpClient詳解、或いは非同期の落とし穴についてHttpClient詳解、或いは非同期の落とし穴について
HttpClient詳解、或いは非同期の落とし穴について
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
Sharding with sql alchemy
Sharding with sql alchemySharding with sql alchemy
Sharding with sql alchemy
 
レシピの作り方入門
レシピの作り方入門レシピの作り方入門
レシピの作り方入門
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
ルータコンフィグのGit管理のススメ 〜Git管理以外を自動化してみた〜
ルータコンフィグのGit管理のススメ 〜Git管理以外を自動化してみた〜ルータコンフィグのGit管理のススメ 〜Git管理以外を自動化してみた〜
ルータコンフィグのGit管理のススメ 〜Git管理以外を自動化してみた〜
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
Spark SQL - The internal -
Spark SQL - The internal -Spark SQL - The internal -
Spark SQL - The internal -
 
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
 

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

ASP.NET 新時代に向けて ~ ASP.NET 5 / Visual Studio 2015 基礎解説
ASP.NET 新時代に向けて ~ ASP.NET 5 / Visual Studio 2015 基礎解説ASP.NET 新時代に向けて ~ ASP.NET 5 / Visual Studio 2015 基礎解説
ASP.NET 新時代に向けて ~ ASP.NET 5 / Visual Studio 2015 基礎解説
Akira Inoue
 
HTML5など社内勉強会 Vol.11 - High Performance Web and iOS 6 WebKit
HTML5など社内勉強会 Vol.11 - High Performance Web and iOS 6 WebKitHTML5など社内勉強会 Vol.11 - High Performance Web and iOS 6 WebKit
HTML5など社内勉強会 Vol.11 - High Performance Web and iOS 6 WebKit
George Harada
 
EPUB3以降とReadium
EPUB3以降とReadiumEPUB3以降とReadium
EPUB3以降とReadium
Makoto Murata
 

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

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

Plus de Joni

Plus de Joni (13)

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

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