Разгоняем asp.net core / Илья Вербицкий (webstoating s.r.o.)
Post on 22-Jan-2018
127 Views
Preview:
TRANSCRIPT
Разгоняем ASP.NET CoreИлья Вербицкий
WebStoating s.r.o.
Обо мне
• 15 лет опыта работы в области финансов и электронной коммерции.
• Совладелец компании WebStoating s.r.o.
• Использую .NET c 2002 года.
Современный .NET
.NET Framework
• Базовая библиотека
• .NET Framework BCL
• Виды приложений
• WPF
• Windows Forms
• Console
• ASP.NET
.NET Core
• Базовая библиотека
• .NET Core BCL
• Виды приложений
• Console
• ASP.NET Core
• UWP
• Xamarin.Forms
Xamarin
• Базовая библиотека
• Mono BCL
• Виды приложений
• iOS
• Android
• MacOS
.NET Core и .NET Standard
.NET Standard
• Множество реализаций .NET
• Проблема повторного использования кода
• Спецификация
• 70% существующего кода совместимо с версией 2.0
• Режим совместимости
.NET Core
• .NET Core 2.0
• Поддержка Windows, Linux иMacOS
• Open Source (MIT)
• Простота развертывания
• Ваш любимый язык программирования
• Любой текстовый редактор
Немного философии
• Вы не Google
• ROI
• Не стоит изобретать велосипед без необходимости
• Сконцентрируйтесь на решении конкретной задачи
• Существует много хороших инструментов. Главное – выбрать правильный для вашего проекта
• Проблемы с производительностью из-за роста популярности – это ОТЛИЧНЫЕ проблемы! Но сначала надо сделать популярный продукт.
Наш сайт тормозит!
Сайт недоступен извне - YSlow
Chrome Developer Tools
Сначала реализуем все рекомендации Google PageSpeed InsightsИногда этого бывает достаточно, особенно если у вас на сайте много больших картинок.
Сборка и минификация JS и CSS
• BuildBundlerMinifier• bundleconfig.json
• <environment> tag helper
• Gulp
• Grunt
• Webpack
Управление пакетами
• NuGet - https://www.nuget.org/
• Packet - https://fsprojects.github.io/Paket/index.html
Обработка изображений
• ImageMagic - http://imagemagick.org/• Magic.NET - https://github.com/dlemstra/Magick.NET
• Не используйте System.Drawing и System.Windows.Media
• LibGD - http://libgd.github.io/• CodeArt.DotnetGD
• ImageProcessor
• DynamicImage
• ImageResizer
Сжатие HTTP-траффика
• Microsoft.AspNetCore.ResponseCompression• GzipCompressionProvider
• ICompressionProvider
• IIS Dynamic Compression Module
• Прокси-сервер NGINX
Веб-сервер Kestrel
• Microsoft.AspNetCore.Server.Kestrel
• Асинхронный веб-сервер, построенный на основе libuv.
• Можно использовать самостоятельно или через прокси-сервер
• Поддержка сокетов Unix, Web-сокетов и HTTPS
• Параметры веб-сервера• MaxConcurrentConnections (нет лимита)
• MaxConcurrentUpgradedConnections (нет лимита)
• MaxRequestBodySize (28.6MB) и RequestSizeLimitAttribute
• MinRequestBodyDataRate (240 байт/сек., грейс-период 5 сек.)
Быстро починить не удалось
Железо стоит дешевле программистов
• Нужен сервер «пожирнее»• Больше памяти
• Больше ядер
• Поддержка Docker
• Облачные провайдеры, поддерживающие ASP.NET Core “из коробки”• Windows Azure
• AWS
• Google App Engine
Теперь посмотрим, что происходит при обработке HTTP-запроса
MiniProfiler
• Разработка Stack Exchange
• MiniProfiler
• MiniProfiler.EF6• SQL-запросы, генерируемые Entity Framework 6
• MiniProfiler.Mvc4• Views
• Контроллеры
«Копаем» глубже
SQL Server Profiler
SELECT N+1 и выбор ORM для проекта
Маппинг POCO-объектов (SELECT, 500 итераций)
SqlDataReader 47ms
Dapper 49ms
ServiceStack.OrmLite 50ms
PetaPoco 52ms
BLToolkit 80ms
SubSonic CodingHorror 107ms
NHibernate 181ms
Entity Framework 631ms
Источник: https://github.com/StackExchange/Dapper
Базу оптимизировали, но не помоглоДобавим кэширование?
Кэширование
• IMemoryCache• Microsoft.Extensions.Caching.Memory
• IDistributedCache• Microsoft.Extensions.Caching.Redis• Microsoft.Extensions.Caching.SqlServer
• Cache Tag Helper• <cache>@DateTime.Now</cache>
• Distributed Cache Tag Helper• <distributed-cache name=“my-id-1”>@DateTime.Now</distributed-cache>
• ResponseCacheAttribute
• Microsoft.AspNetCore.ResponseCaching
Наша память куда-то утекаетМожет быть, проблема в сборщике мусора?
Режимы работы сборщика мусора
• Workstation GC• Concurrent
• Non-concurrent
• Server GC• Background
• Non-concurrent
Web.config
<configuration>
<runtime>
<gcServer enabled="true|false"/>
<gcConcurrent enabled="true|false"/>
<gcTrimCommitOnLowMemory enabled="true|false"/>
...
</runtime>
</configuration>
[AppName].runtimeconfig.json
{
"runtimeOptions": {
"configProperties": {
"System.GC.Server": true|false,
"System.GC.Concurrent": true|false,
...
},
...
}
Профилирование памяти в VS 2017
PerfView: Сколько времени тратится на GC?
PerfView: Где выделяется память?
PerfView: Текущие объекты в хипе
На сервере нет Visual Studio? - WinDbg
C:\bin>procdump.exe -ma MemoryLeak
.loadby sos clr
!dumpheap -stat
!dumpheap -type System.String
!do 0336dc54
!dumparray /d 0336dc54
!do 0336dfb8
Пара слов о постраничной навигации
var persons = db.Person
.OrderBy(p => p.FirstName)
.ThenBy(p => p.LastName)
.ToList();
foreach(var person in persons.Take(100))
{
…
}
select FirstName, LastName
from Person.Person
order by FirstName, LastName
offset 0 rows
fetch next 10 rows only
«Ручное» управление памятью
• WeakReference
• GCSettings.LatencyMode• LowLatency (Workstation GC only)• SustainedLowLatency (Workstation and Server GC)• Данный период должен быть как можно короче• Постарайтесь не выделять большие объекты• GC.Collect
• GC.TryStartNoGCRegion и GC.EndNoGCRegion
• Как насчет собственного сборщика мусора?• Local GC Project (CoreCLR)• https://github.com/dotnet/coreclr/tree/master/src/gc/sample.
GC настроили, а «тормоза» осталисьПроблемы с I/O, сетью и CPU.
Профилирование кода в MiniProfiler
Профилирование приложений в VS 2017
Асинхронные операции
Task Parallel Library
• Paraller.For и Parallel.ForEach
• Task.WhenAny, Task.WhenAll и Task.ContinueWith
• CancellationToken
• Palallel LINQ
Async/await «быстрее», но это не точно
• Код интенсивно использует I/O и сеть, а не CPU
• Вы хотите разрешить пользователям прерывать долгие операции
• Прирост производительности приложения превышает затраты на переключение контекста
• Асинхронные операции НЕ ВЫПОЛНЯЮТСЯ быстрее, чем синхронные
• Не стоит делать все приложение асинхронным!
Очереди сообщений и микросервисы
• MQ• StackExchange.Redis
• Turbocharged.Beanstalk
• ZeroMQ
• RdKafka
• Service Bus• NServiceBus
• MassTransit и MassTransit.RabbitMQ
• RestBus.AspNet и RestBus.RabbitMQ
Итоги
1. ROI
2. Выполните рекомендации Google PageSpeed Insights
3. Вертикальное масштабирование
4. Проверьте, нет ли проблем с базой данных
5. Профилирование памяти и настройка GC
6. Кэширование
7. Профилирование операций I/O, работы с сетью и CPU
8. MQ и микросервисы
Спасибо!
• https://verbitskiy.co/
• Twitter: @ilich_x86
• GitHub: https://github.com/ilich
top related