2013-03-20 13 views
19
  1. Dowiedziałem się, że node.js używać libeio wewnętrznie do wykonywania asynchronicznego plik I/O, z puli wątków, na * nix platformy, mam rację?
  2. Co o async sieci I/O? Czy robi to libev? Czy istnieje również puli wątków?
  3. Jeśli w środku jest pula wątków, jak może być bardziej wydajna niż tradycyjny model z jednym wątkiem na żądanie? I czy jest to jeden wątek na żądanie we/wy?
  4. A jaki jest mechanizm w systemie Windows? Wiem, że to zrobione przez IOCP, i jest pulpit wątku poziomu jądra, prawda?
  5. Dlaczego linux nie ma natywnego mechanizmu całkowicie AIO takiego jak Windows IOCP? Czy będzie w przyszłości?

Aktualizacja według odpowiedź changchang za:Zamieszanie o node.js mechanizm wewnętrzny asynchroniczne I/O

  1. Wzięłam szybki pogląd na source code @changchang dały, okazało się, że domyślny rozmiar puli wątków można skasować UV_THREADPOOL_SIZE, zastanawiam się w takim przypadku zostanie to wykorzystane?
  2. Znalazłem również getaddrinfo użyć tej puli wątku, czy jest tam więcej oprócz fs? A jeśli wszystkie zadania synchronizacji zostaną wykonane w tej puli wątków, czy domyślny rozmiar to "4"?
  3. Jak już rozumiem, w procesie node.js będzie 6 podstawowych wątków: 1 wątek V8 (pętla zdarzeń, w której uruchamiane są kody javascript użytkownika), 1 pętla zdarzeń libuv i 4 w puli wątków, czy mam rację?
  4. A jak mogę zobaczyć te wątki w mojej powłoce (Ubuntu)? Używam ps -eL | grep node | grep -v grep widział tylko dwa:

    głównego 16148 7492 16148 0 2 20:43 pkt/26 0:00:00 ./bin/node /home/aaron/workspace/test.js
    pierwiastek 16148 7492 16149 0 2 20:43 pkt/26 0:00:00 ./bin/node /home/aaron/workspace/test.js

+0

Zobacz tutaj http://stackoverflow.com/questions/10680601/nodejs-event-loop – user568109

+1

node.js faktycznie korzysta [libuv] (https://github.com/joyent/libuv/) abstrahować asynchroniczne IO dla wszystkich obsługiwanych platform – Milan

+0

@ user568109 Przeczytałem o tym, ale nie mogę uzyskać prostej odpowiedzi, w rzeczywistości niejasna ekspresja wprowadza mnie w zakłopotanie. Wspomniał, że libeio "wykonuje asynchronicznie dane wejściowe", w tym gniazda, wątpię w to. Nauczyłem się tego skądś: ponieważ nie można używać epola na zwykłych plikach, to tutaj przychodzi libeio, aby wykonać aio z wątkami. –

Odpowiedz

24
  1. Przede wszystkim libuv usunie z niego libeio . Ale wykonuje on operacje wejścia/wyjścia pliku asynchronicznego z pulą wątków, taką jak wspomniałem, pod numerem libeio.

  2. libuv usuwa również libev. Działa we/wy sieci asynchronicznej na podstawie asynchronicznych interfejsów We/Wy na różnych platformach, takich jak epoll, kqueue i IOCP, bez puli wątków. Istnieje pętla zdarzeń, która działa na głównym wątku uv, który odpytuje zdarzenia I/O i przetwarza je.

  3. Pula wątków wewnątrz libuv jest pulą wątków o stałym rozmiarze (4 in uinx like system). Wykonuje rolę kolejki zadań i unika wyczerpywania zasobów systemowych, generując wątki w nieskończoność w miarę wzrostu liczby żądań.

+0

Zbiorniki dużo, wiele zasobów jest nieaktualna, właśnie mnie uratowałeś! –

+2

@AaronWang powinieneś to zaakceptować, jeśli odpowiedziała na twoje pytanie. – travis

+0

Węzeł AFAIK ustawia rozmiar puli wątku libuv na liczbę rdzeni –

2

uptil wersja 0.6 węzeł stosuje libev uruchomić zdarzeń pętli i libeio asynchronicznego I/O (Unix backend mocno siedzi w tych bibliotek).Ale libuv zaczął zastępować libev i libeio w version 0.8. Wykonuje, obsługuje i zarządza wszystkimi obiektami io i zdarzeniami w puli zdarzeń. libuv to wybór między wieloplatformowymi asynchronicznymi bibliotekami IO.

  1. Tak, zapisu do 0,6 węzła, przestarzałe w 0.8 i korzysta z puli wątków
  2. Tak, ale libev nie korzysta z puli wątków. Zobacz here

    Wyjaśnienie: Według link w question napisałem, libeio obsługuje wszystkie funkcje POSIX czynienia z I/O (który obejmuje gniazdo). Jednak autor węzła zdecydował się użyć go tylko do obsługi I/O plików asynchronicznych i używa libev dla operacji we/wy sieci. Nie wiem, skąd to słyszałeś, ale możesz użyć epola na zwykłych plikach.

  3. libev wykorzystuje pętlę zdarzeń, więc nie ma tu problemów.

  4. Tak IOCP obsługuje asynchroniczne operacje we/wy w systemie Windows, jądro korzysta z pul wątków.
  5. Nowe jądro Linuxa ma epoll, kino w nowym jądrze BSD. libev i libeio były dla środowiska Linux i zapewnia pętlę zdarzeń/asynchroniczne IO dla całego jądra (obsługuje select, poll, epoll, kqueue).

pytania Aktualizacja:

  1. nie wiem zbyt wiele o libuv
  2. może wystarczy (nie wiem)
  3. Oto moje ustalenia dotyczące Windows 8, sprawdził go za pomocą Process Explorer. Pokazano 4 wątki, 1 bibliotekę DLL, 1 plik i 1 sekcję (łącznie 7 wpisów) dla procesu aplikacji węzła.

  4. ps -eLf pokazuje wszystkie wątki i procesy, może przesklepiasz je, po prostu znajdź pid procesowy węzła, taki jak ps -eLf | grep x, gdzie x to pid dla procesu węzła.

+0

Dzięki. Próbowałem 'ps -eLf | grep pid', wciąż ten sam wynik –