2011-07-25 14 views
14

Właśnie testuje bardzo proste komendy:Dlaczego Cygwin wykonuje polecenia powłoki bardzo wolno?

while true; do bash -c "echo hello"; done 

Znajdziesz ile powolny w bash Cygwin jest. Czy ktoś wie dlaczego?

Jest to nowa instalacja cygwin 1.7 na win7.

dzięki Jareda testowania pomysłu, I zmodyfikowane polecenia to (dodaje bash -c):

time for i in {1..10} ; do bash -c "echo Hello" ; done 
Hello 
... 
real 0m7.711s //it's the problem 
user 0m0.091s 
sys 0m0.476s 
+1

Może problem polega na tym, że Windows 7 nie może tworzyć procesów bardzo szybko? –

+6

Windows nie może * rozwidlać * procesów bardzo szybko. W rzeczywistości nie "widelec" w ogóle. Cygwin fałszuje to, ale nie może zrobić tego tak blisko, jak efektywnie, jak prawdziwa puszka * nix. Każdy proces zaczyna się od zera i musi załadować i zainicjować bibliotekę DLL cygwin, libc itp., Którą załadował system fork-and-go. – cHao

+0

Ale dziwne jest to, że podczas polecenia tworzenia 10 procesów na około 7,7 sekund, procesor jest pusty i widać, że czas użytkownika i sys jest nieco. Wygląda na to, że bash czeka na coś, ale na co czeka? – Lcsky

Odpowiedz

4

Wreszcie znalazłem źródło - usługa o nazwie "Usługa QQPCMgr RTP" uruchomiona na moim komputerze biurowym, jest to usługa ochrony w czasie rzeczywistym "QQ PC Manager".

Po wyłączeniu go, czas skryptu w pytaniu wraca do:

real 0m0.943s 
user 0m0.105s 
sys  0m0.231s 

Powiedziałem z twórcami QQPCMgr na ten temat, mam nadzieję, będą one znaleźć przyczynę.

To wciąż dużo wolniejsze niż Linux, ale dostaje ten sam "czas rzeczywisty" z innych komputerów cygwin.

Dziękuję wszystkim!

+3

Jak to określiłeś? Szukałem usługi, ale jej nie widzę i mam ten sam problem. czas dla i w {1..10}; wykonaj bash -c "echo Hello"; gotowe Witam ... prawdziwe 0m18.070s użytkownik 0m0.061s sys 0m0.385s –

1

Wywoływanie bash ze skryptu powłoki nie może być szybki. Czy jest to szybsze, aby po prostu użyć

while true; echo hello; done 

?

+2

tak, to jest powód, dla którego Dodałem "bash -c" w linii pytania, jeśli nie, działa bardzo szybko! Ale skrypty konfiguracyjne, Makefile działają poprzez wywołanie nowego basha, a więc jest bardzo powoli. – Lcsky

5

Sprawdź swoją ścieżkę. Odwołanie się do nieistniejącej ścieżki lub bardzo wolny udział sieciowy może spowodować opisywane symptomy.

1

Wpiszmy kilka liczb. Pobiegłem co następuje:

time for i in {1..1000} ; do echo "Hello" ; done 

Wynikiem dostaję od standardowego okna bash Cygwin jest:

... 
Hello 
Hello 

real 0m0.584s 
user 0m0.031s 
sys  0m0.000s 

A z okna xterm bash w tym samym systemie uzyskać:

... 
Hello 
Hello 

real 0m0.037s 
user 0m0.016s 
sys  0m0.000s 

Myślę, że to prawie odpowiada na twoje pytanie. Problem polega na tym, że przechodzisz przez okno "Windows" "cmd", które jest z natury wolne. Sam Cygwin nie jest problemem, to wyświetlacz, który stara się nadążyć, spowalnia działanie (w tym teście).

+0

'code' $ czas na i w {1..10}; wykonaj bash -c "echo Hello"; zrobione Witam ... prawdziwe 0m7.711s użytkownik 0m0.091s SYS 0m0.476s – Lcsky

+0

OK, coś jest zdecydowanie nie tak z konfiguracją czy to przy 700 ms do wykonania pojedynczego echa. Czy próbowałeś tego w Xterm? Musisz również pobrać pakiety X, aby to uzyskać. – Jared

+1

Wykonujesz 'echo' w bieżącej powłoce, podczas gdy op tworzy nową powłokę, aby wykonać każde echo. To spowoduje różnicę wydajności. –

1

Głosowałem za przyjęciem Jamesa McLeoda, ponieważ rozpoczęcie procesu bash zajmuje trochę czasu, ale to nie znaczy, że będzie uruchamiał polecenia wolniej niż w UNIX.

Wywołanie bash -c z poziomu skryptu basha jest bliskie bezsensowności, a pliki Makefile mogą wywoływać wiele podprocesów basha, chyba że na końcu poleceń zostanie dołączony ; \.

Na przykład, jeśli Makefile ma następujący:

echo Hello World 
echo Good Bye 

Będzie ona wywołać dwa procesy bash. Aby zrobić to szybciej i wywołać tylko jeden proces bash:

echo Hello World; \ 
echo Good Bye 

Debian przyjęła kreskę zamiast bash jako głównej powłoki, ponieważ począwszy od wielu skryptów za pomocą bash uczyni system znacznie dłużej, aby uruchomić (każde wywołanie skryptu własny proces basha).

3

Poniżej znajdują się 2 przyczyny przyczyn, które napotkałem. Oczywiście inne niewymienione problemy mogą również powodować powolne polecenia powłoki w Cygwin.

  • Jeśli masz opcję „Automatycznie wykryj ustawienia” w „Ustawienia sieci LAN”, Windows użyje protokołu WPAD odkryć lokalny serwer proxy HTTP. Najpierw wyśle ​​żądanie DHCP "Powiadom" z opcją 252, a następnie spróbuje wyszukać DNS w "wpad". Te 2 operacje mogą potrwać kilka sekund.

  • Jeśli powłoka uzyskuje dostęp do niektórych ścieżek, takich jak /cygdrive/..., zostanie wykonane zapytanie o nazwę NetBIOS, co może również zabrać trochę czasu.

Solutions:

  • Disable "Automatycznie wykryj ustawienia" w menu "Ustawienia sieci LAN" w systemie Windows "Opcje internetowe" Panel sterowania.

  • Dodaj następujący wpis w %SystemRoot%\system32\drivers\etc\hosts:

127.0.0.1 localhost cygdrive wpad

+0

"Wyłącz" Automatycznie wykryj ustawienia "w" Ustawienia LAN "." - Jak mam to zrobic ? Nie mogę znaleźć instalatora cygwin. – Steam

+0

To nie jest ustawienie Cygwin, ale ustawienie systemu Windows – Demi

+1

@Steam, wyszukaj * Opcje internetowe * z menu Start> Wyszukaj, otwórz je, kliknij kartę Połączenia, kliknij Ustawienia i usuń zaznaczenie opcji Automatycznie wykryj ustawienia – SomeGuyOnAComputer

1

udało mi się rozwiązać ten problem przez odinstalowanie bash uzupełniania i przełączania z Kaspersky Windows Security Essentials. (Zdiagnozowałem interferencję Kaspersky za pomocą Process Explorer podczas wykonywania testu porównawczego "echo Hello".) Sprowadziłem mój czas testowy z 7 sekund do 0.2.

+0

W moim przypadku zatrzymanie usługi AVP (Kaspersky Endpoint Security Service) skrócił czas uruchamiania procesu z 200ms do prawie <1ms. Niestety [Microsoft Security Essentials najwyraźniej Cię nie chroni] (http://www.pcpro.co.uk/reviews/software/379954/microsoft-security-essentials), więc nie jest to dla mnie wybór – sinelaw

11

Co z wyłączeniem ścieżek Cygwin z oprogramowania antywirusowego?

+1

Używam avast i to rozwiązanie sprawdziło się u mnie. – iCantSeeSharp

+0

Które ścieżki są ścieżkami Cygwin? Wyłączyłem ten - C: \ cygwin64. Przy okazji, dla niektórych programów antywirusowych, takich jak norton, możesz znaleźć opcję "wyjątki" gdzieś i dodać ten folder do listy wyjątków. – Steam

+0

Czy powinienem również dodać folder, do którego cygwin pobiera wszystkie swoje pakiety? Oznacza to, że ma dziwną nazwę - 'ftp% 3a% 2f% 2fftp.harvard.univ.edu% 2fpub% 2fcygwin% 2f' – Steam

1

Na Comodo Internet Security Premium 10, dodałem "C: \ Users \\ Documents \ MobaXterm \ slash \ bin" do listy zaufanych plików. (Ustawienia -> Ocena pliku -> Lista plików). Lokalny terminal znów jest szybki.

1

Tak właśnie objawił się ten problem. Dla pierwszego powiedzmy, że 20 poleceń wprowadzonych w podpowiedzi cygwin jest szybkie, wtedy nagle staje się boleśnie powolne.

Sprawdziłem, czy każdy element na mojej ścieżce jest prawidłowym katalogiem.

Próbowałem naprawić uwierzytelniania sugerowane gdzie indziej - https://superuser.com/questions/877051/cygwin-from-windows-very-slow-laggy/1247517. To nie działa dla mnie.

Wymieniłem mój dotychczasowy skaner antywirusowy (System Center Endpoint Protection) na Sophos. To naprawiło problem dla mnie. Mam nadzieję że to pomoże.