Lepiej się nie spieszyć z wdrożeniem .NET 4.6, Microsoft wydał je z poważnym bugiem Strona główna Aktualności28.07.2015 22:26 Udostępnij: O autorze Piotr Maciejko @Savpether 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. 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. 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. 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. Oprogramowanie Udostępnij: © dobreprogramy Zgłoś błąd w publikacji Zobacz także Kolejne problemy Microsoftu z .NET: środowisko wykorzystywane do ataków 18 lip 2015 Maciej Olanicki Oprogramowanie 46 Skończcie już z tym Silverlightem! Microsoft wzywa serwisy wideo do nowoczesności 3 lip 2015 Adam Golański Oprogramowanie 76 Facebook wprowadza nowe bug bounty. Hacker Plus będzie polegać na rywalizacji 13 paź 2020 Arkadiusz Stando Oprogramowanie Internet Bezpieczeństwo 1 Znajdź lukę w PlayStation 4 albo PSN. Sony wypłaci nawet 50 tysięcy dolarów 26 cze 2020 Arkadiusz Stando Oprogramowanie Biznes Bezpieczeństwo 23
Udostępnij: O autorze Piotr Maciejko @Savpether 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. 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. 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. 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. Oprogramowanie Udostępnij: © dobreprogramy Zgłoś błąd w publikacji