Lepiej się nie spieszyć z wdrożeniem .NET 4.6, Microsoft wydał je z poważnym bugiem

Strona głównaLepiej się nie spieszyć z wdrożeniem .NET 4.6, Microsoft wydał je z poważnym bugiem
28.07.2015 22:26
Lepiej się nie spieszyć z wdrożeniem .NET 4.6, Microsoft wydał je z poważnym bugiem
Piotr Maciejko
Piotr Maciejko
bDXCUsti

Podczas testów działania serwisu Stack Overflow na zaktualizowanej wersji platformy .NET 4.6 pojawiły komplikacje, które poskutkowały decyzją o wstrzymaniu procesu wdrożenia tej technologii. Problemy dotyczyły narzędzia zwanego MiniProfilerem, które umożliwia wykonywanie pomiarów związanych z wydajnością kodu, np. sposobu i czasu wykonywania wątków. Należy nadmienić, że subtelny w swojej naturze błąd zawiera się w błędnej implementacji mechanizmu o nazwie Tail Call przez kompilator RyuJIT w wersji 64-bitowej.

bDXCUssB

Twórcy Stack Overflow bardzo długo nie mogli odnaleźć przyczyny nieprawidłowości, gdyż była ona widoczna dopiero w przypadku produkcyjnej wersji aplikacji. Zatem testując kod w trybie zwanym Debug programiści stracili mnóstwo czasu nie otrzymując w zamian chociażby poszlaki, która mogłaby posłużyć do znalezienia błędu. Najpierw zespół zauważył błędne działanie MiniProfilera, który wyświetlał dane tylko w przypadku pierwszego ładowania strony. Takie zachowanie sugerowało błąd buforowania zaszyty w pamięci podręcznej działającego lokalnie HTTP. Programiści spróbowali więc ustawić długość przechowywania danych w pamięci podręcznej na 3600 sekund. Okazało się jednak, że w większości przypadków (~98%) ulegały one natychmiastowemu usunięciu z pamięci podręcznej HTTP.

350139788546041289

Kolejnym krokiem prowadzącym do odnalezienia błędu była możliwość jego powtórzenia tylko przy odhaczonej opcji Optimize Code we właściwościach projektu. Po tym zabiegu programiści przetestowali sporą ilość kodu i odkryli, że jedna z wywoływanych metod nie otrzymuje przekazywanych do niej parametrów. Opisane zachowanie zasugerowało, że lokalna pamięć podręczna albo nie istnieje, albo działa w sposób nieprzewidywalny. Ostatecznie spowodowało to ogromny narzut na infrastrukturę sieciową i w znacznym stopniu zmniejszyło wydajność serwisu Stack Overflow.

bDXCUssD

Najskuteczniejszym rozwiązaniem problemu jest wstrzymanie się z aktualizacją do nowszej wersji .NET. Istnieje też możliwość wyłączenia RyuJIT bezpośrednio w rejestrze za pomocą stosownego menedżera lub w terminalu PowerShell. Należy nadmienić, że dodanie znacznika w pliku konfiguracyjnym aplikacji nie rozwiązuje problemu. Więcej szczegółów dostępne jest na blogu Nicka Cravera.

Aktualizacja

Zespół odpowiedzialny za rozwój .NET-u potwierdził występowanie błędu, zapewnił jednak, że w normalnych środowiskach produkcyjnych szansa jego wystąpienia jest niewielka. Łatki jednak nie wydano, zalecono jedynie w razie wystąpienia opisanych przez programistów Stack Overflow problemów wyłączenie optymalizacji Tail Call. Więcej szczegółów znajdziecie na blogu .NET.

Udostępnij:
bDXCUstz