Azure Website slow to serve static JS / CSS but not binary

Mam witrynę/aplikację internetową Azure, która jest niewiarygodnie powolna, aby obsługiwać statyczne pliki JS i CSS, ale wydaje się doskonale obsługiwać pliki binarne.

Aby przetestować problem wgrałem dwa pliki 30MB, jeden duży.js i inne duże.rar. Plik JS pobiera się z prędkością około 100KB / s, Jeśli mam szczęście. Plik RAR pobiera się z prędkością około 4000 KB / s. Wyniki są niezwykle spójne.

Sprawdziłem w Fiddlerze i kompresja gzip występuje w obu przypadkach. Zgodnie z oczekiwaniami plik JS jest jest wysyłany z typem MIME application / x-javascript podczas gdy plik RAR jest obsługiwany jako application/octet-stream .

Staram się to zrozumieć-dlaczego IIS miałby serwować jeden rodzaj statycznych treści o wiele wolniej niż inne?

Author: Matt Jenkins, 2015-03-31

3 answers

Mieliśmy ten problem i udało nam się go rozwiązać za pomocą Zespołu Pomocy technicznej platformy Azure. Problem polegał na tym, że wolne pliki używały polecenia TransferEncoding: Chuncked. Zasugerowali, że wymusimy statyczną kompresję, aby obejść ten problem.

Musieliśmy dodać do <system.webServer>:

<serverRuntime enabled="true"  frequentHitThreshold="1"  frequentHitTimePeriod="00:00:20" />
 33
Author: John Tseng,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-08 21:29:35

Aby rozwinąć odpowiedź Johna Tsenga: (z tutaj )

Jak widziałeś wcześniej, IIS 7 buforuje skompresowane wersje statyczne pliki. Tak więc, Jeśli pojawi się żądanie o plik statyczny, którego skompresowany wersja jest już w pamięci podręcznej, nie trzeba jej kompresować jeszcze raz.

Ale co jeśli w pamięci podręcznej nie ma skompresowanej wersji? Will IIS 7 następnie skompresować plik od razu i umieścić go w pamięci podręcznej? Odpowiedź jest tak, ale tylko wtedy, gdy plik jest Często zadawane pytania. By not kompresowanie plików, które są wymagane tylko rzadko, IIS 7 zapisuje Wykorzystanie PROCESORA i przestrzeni pamięci podręcznej.

Domyślnie plik jest uważany za często żądany, jeśli jest wymagane dwa lub więcej razy na 10 sekund.

Więc powodem, dla którego użytkownicy otrzymują nieskompresowaną wersję pliku javascript, jest to, że nie spełnia on domyślnego progu kompresji; innymi słowy, plik javascript nie został poproszony 2 razy w ciągu 10 sekund.

Aby to kontrolować, jest jeden atrybut, który musimy zmienić na elemencie <serverRuntime>, który kontroluje kompresję: frequentHitThreshold. W celu skompresowania pliku, gdy jest on żądany raz, Zmień element <serverRuntime>, aby wyglądał tak:

<serverRuntime enabled="true" frequentHitThreshold="1" />

To nieznacznie wpłynie na wydajność procesora, jeśli masz wiele plików javascript, które są obsługiwane i masz użytkowników dość często, ale prawdopodobnie jeśli masz użytkowników wystarczająco często, aby wpłynąć na procesor z kompresji tych plików, to są już skompresowane i buforowane!

 2
Author: CC Inc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-27 07:21:02

Wygląda na to, że był to problem w IIS 8.5 i nie tylko specyficzny dla platformy Azure.

Teraz Usługa App service Aktualizacja do systemu Windows Server 2016 wygląda na kompletną i to obejście nie powinno być potrzebne.

 0
Author: Toma Bussarov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-07 17:28:18