Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Ajax vs sockety, zużycie CPU
nmts
post 7.04.2015, 01:06:48
Post #1





Grupa: Zarejestrowani
Postów: 283
Pomógł: 34
Dołączył: 21.03.2008

Ostrzeżenie: (0%)
-----


Mam stronę, która w krótkim czasie jest odwiedzana przez 2500 osób, dla każdej z tych osób odpala się ajax co 5 sekund (celem aktualizacji wyświetlanych danych),
co sprawia, że zużycie 4 rdzeni na VPS jest na dość wysokim poziomie. Chciałbym zmniejszyć zużycie CPU przez zastosowanie zamiast ajaxa socket.io po stronie front-endu oraz nodejs po stronie back-endu,
po środku by był elephant.io - schemat działania byłby następujący: użytkownik po przez php (elephant.io) wysyłał by wiadomość do serwera (nodejs), a ten z kolei rozsyłał by wiadomość ze zmianą do wszystkich połączych przez sockety.

Czy jest ktoś mi w stanie powiedzieć jaki jestem w stanie uzyskać skok w wydajności stosując takie rozwiązanie zamiast ajaxa? (procentowo, liczbowo, whatever)

Ten post edytował nmts 7.04.2015, 01:08:20


--------------------
Free Web Tools - narzędzia dla programistów, webdeveloperów i specjalistów seo...
Go to the top of the page
+Quote Post
by_ikar
post 7.04.2015, 07:39:51
Post #2





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

Ostrzeżenie: (0%)
-----


Jeżeli nie będziesz wysyłać za dużo emitów na sekundę, bo przecież możesz robić broadcast do wszystkich klientów, co jest w sumie jednym emitem. kwestia tego ile tych emitów będziesz robić od klientów; to widziałem gdzieś konfiguracje jak upchnąć milion aktywnych połączeń na 16gb ram. Nie bardzo rozumiem po co ci elephant.io, skoro dostęp do soketów masz już po stronie frontendu..

I tak, sokety będą wydajniejsze od xhr'a, który będzie za każdym razem tworzyć nowe połączenie, zupełnie inaczej niż sokety, które będą to połączenie utrzymywać.
Go to the top of the page
+Quote Post
nmts
post 7.04.2015, 09:43:13
Post #3





Grupa: Zarejestrowani
Postów: 283
Pomógł: 34
Dołączył: 21.03.2008

Ostrzeżenie: (0%)
-----


Cytat(by_ikar @ 7.04.2015, 08:39:51 ) *
Jeżeli nie będziesz wysyłać za dużo emitów na sekundę, bo przecież możesz robić broadcast do wszystkich klientów, co jest w sumie jednym emitem. kwestia tego ile tych emitów będziesz robić od klientów; to widziałem gdzieś konfiguracje jak upchnąć milion aktywnych połączeń na 16gb ram. Nie bardzo rozumiem po co ci elephant.io, skoro dostęp do soketów masz już po stronie frontendu..

I tak, sokety będą wydajniejsze od xhr'a, który będzie za każdym razem tworzyć nowe połączenie, zupełnie inaczej niż sokety, które będą to połączenie utrzymywać.


No właśnie broadcast do wszystkich byłby najsensowniejszy. Emitów będzie tyle ile osób, które odwiedza stronę czyli np. 2500 jak w przykładzie, bo każda wchodząc może zmienić jednorazowo dane.
Elephant.io chciałem użyć ponieważ wtedy całość ogranicza się jedynie do wysłania emita do serwera w odpowiednim momencie, gdybym robił to po stronie front-endu to musiałbym rozbudować
kod po stronie nodejs celem walidacji danych i uzupełniania danych w bazie - a ponieważ nie znam się na nodejs dlatego chciałem to maksymalnie uprościć.
Na razie nie mam do tego głowy, dałem ogłoszenie na freelancerach, może ktoś mi to ogarnie. closedeyes.gif


--------------------
Free Web Tools - narzędzia dla programistów, webdeveloperów i specjalistów seo...
Go to the top of the page
+Quote Post
by_ikar
post 7.04.2015, 10:48:24
Post #4





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

Ostrzeżenie: (0%)
-----


No to może zamiast sokety, użyj server sent events, z xhr'em dla przeglądarek które tego nie obsługują (ie). I całość możesz zrobić w php z odrobiną javascriptu. Nie rozumiem, emitów tyle co osób? Po co ci tyle emitów jednocześnie ?
Go to the top of the page
+Quote Post
nmts
post 7.04.2015, 21:42:22
Post #5





Grupa: Zarejestrowani
Postów: 283
Pomógł: 34
Dołączył: 21.03.2008

Ostrzeżenie: (0%)
-----


Cytat
Nie rozumiem, emitów tyle co osób? Po co ci tyle emitów jednocześnie ?


Nie jednocześnie, w krótkim odstępie czasu. Jest to strona do tworzenia ankiet online, wyniki ankiet są aktualizowane na bieżąco - aktualnie za pomocą ajaxa. To tak pokrótce opisując przypadek.

Cytat
No to może zamiast sokety, użyj server sent events


Nie podoba mi się w SSE, że żeby to w ogóle działało muszę przesłać określoną ilość znaków (chociażby białych) z uwagi na limity przeglądarek (wiadomości tą metodą zostaną odebrane gdy zostanie przekroczona określona ilość bajtów). Może się nie potrzebnie czepiam, ale mnie to denerwuje, bo to znacznie więcej niż potrzebuje przesłać. snitch.gif No chyba, że jest jakieś rozwiązanie, o którym nie wiem. Nie mówiąc już o tym, że zawsze by było coś wysyłane nawet jakby nic się nie zmieniło, no chyba, że po prostu nie wiem jakby to miało działać. wink.gif

Ten post edytował nmts 7.04.2015, 23:55:36


--------------------
Free Web Tools - narzędzia dla programistów, webdeveloperów i specjalistów seo...
Go to the top of the page
+Quote Post
by_ikar
post 8.04.2015, 09:07:15
Post #6





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

Ostrzeżenie: (0%)
-----


Sokety też wysyłają handshak'i, które też zawierają jakieś znaki, nie ma tego tam za dużo, no ale też jest. Zaproponowałem ci SSE z uwagi na to że jak to napisałeś, nie chcesz babrać się w js, bo wolisz to zrobić w php. A roboty jest tak na prawdę tyle samo. A JS tak na prawdę źle wygląda tylko po stronie przeglądarki z uwagi na DOM, tam gdzie tego DOM'a nie ma, JS jest nawet przyjemny.

Podsumowując, 4 rdzenia nie wiele mi mówią, fajnie by było wiedzieć jakie to są 4 rdzenia. Kolejna sprawa jest taka że node jest 1 wątkowy, czyli będzie pracować i tak na jednym rdzeniu. Do tego musisz albo napisać sobie klaster, albo użyć jakiegoś pakietu który ten klaster uruchomi z drobną konfiguracją. Dodatkowo potrzebujesz jakiś spawner, bo node sam w sobie może ci się wywalić, w końcu jest to wersja aż 0.10, więc jest to zrozumiałe i tutaj też przyda się jakiś spawner. Również polecam PM2 bo on dokładnie to robi, dzięki czemu aplikacja działa bez przerwy. No a jak klaster, a node chodzi w jednym wątku, to musisz jakoś połączyć sokety, aby nie było tak że użytkownicy będą w różnych wątkach i się ze sobą nie dogadają, więc przyda ci się jakiś redis, czy inny, aby te emity współdzielić. Jest z tym sporo roboty, sporo do nauczenia się. Stąd moja propozycja odnośnie SSE. Ale jeżeli to ogarniesz i nie są to jakieś beznadziejne rdzenia, to spokojnie powinieneś dać rade, w sumie nawet w jednym wątku, kwestia tego jaki to jest procesor.

Ten post edytował by_ikar 8.04.2015, 09:08:23
Go to the top of the page
+Quote Post
!*!
post 8.04.2015, 09:27:16
Post #7





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


Cytat(nmts @ 7.04.2015, 02:06:48 ) *
... jest odwiedzana przez 2500 osób ... Jest to strona do tworzenia ankiet online, wyniki ankiet są aktualizowane na bieżąco ...


2500? 2,5k? dwa tysiące pięćset? Toć to maleństwo. Panie, weź Pan pierwszy lepszy z brzegu serwer ws w php (python) pisany na kolanie, zrób obsługę websocetów po stronie przeglądarki (flash dla kompatybilności z ie) mała obróbka JSON i po sprawie... a nie wyciągasz rakiety atomowe na komara :D


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
nmts
post 8.04.2015, 10:42:33
Post #8





Grupa: Zarejestrowani
Postów: 283
Pomógł: 34
Dołączył: 21.03.2008

Ostrzeżenie: (0%)
-----


Cytat
2500? 2,5k? dwa tysiące pięćset? Toć to maleństwo. Panie, weź Pan pierwszy lepszy z brzegu serwer ws w php (python) pisany na kolanie, zrób obsługę websocetów po stronie przeglądarki (flash dla kompatybilności z ie) mała obróbka JSON i po sprawie... a nie wyciągasz rakiety atomowe na komara biggrin.gif


Aktualnie ilość jednoczesnych userów może dosiegać tej liczby, ale mój plan rozwoju (który czeka na wdrożenie) przewiduje większe liczby (dokładnie nie wiem). Są to krótkotrwałe odwiedziny, ale stosując obecne rozwiązania bardzo zasobożerne. tongue.gif Nie mniej pomyśle nad serwerem w php, może na chwilę obecną wystarczy. snitch.gif

Ten post edytował nmts 8.04.2015, 10:44:49


--------------------
Free Web Tools - narzędzia dla programistów, webdeveloperów i specjalistów seo...
Go to the top of the page
+Quote Post
Tuminure
post 8.04.2015, 11:13:18
Post #9





Grupa: Zarejestrowani
Postów: 178
Pomógł: 49
Dołączył: 16.04.2012
Skąd: Bytom

Ostrzeżenie: (0%)
-----


Cytat
Nie jednocześnie, w krótkim odstępie czasu. Jest to strona do tworzenia ankiet online, wyniki ankiet są aktualizowane na bieżąco - aktualnie za pomocą ajaxa. To tak pokrótce opisując przypadek.

Ale przecież ilość emitów nie powinna być zależna od ilości użytkowników, a po prostu powinny być wysyłane broadcasty zależne od ilości ankiet.

1 broadcast = 1 ankieta.
Jeżeli dajmy na to masz 10 aktywnych ankiet, to wysyłasz co 5 sekund 10 broadcastów, które trafiają do wszystkich oglądających poszczególne ankiety.

Ewentualnie...
1 broadcast = wszystkie ankiety.
Możesz rozsyłać nawet i jeden broadcast do każdego użytkownika strony, który będzie zawierał dane z wszystkich ankiet. Jeżeli masz zamiar mieć dużo aktywnych ankiet, to może być przesyłane zbyt dużo danych... jeżeli jednak masz kilka ankiet, to nie rozdrabniałbym się i po prostu zrobił to w taki sposób.

Ten post edytował Tuminure 8.04.2015, 11:15:54
Go to the top of the page
+Quote Post
nmts
post 27.04.2015, 10:24:36
Post #10





Grupa: Zarejestrowani
Postów: 283
Pomógł: 34
Dołączył: 21.03.2008

Ostrzeżenie: (0%)
-----


Cytat
Ale przecież ilość emitów nie powinna być zależna od ilości użytkowników, a po prostu powinny być wysyłane broadcasty zależne od ilości ankiet.


Tu chodziło mi o emity z PHP przesyłane do serwera ws informujące go o oddaniu głosu. No bo przecież zanim serwer wyślę broadcast do użytkowników konkretnej ankiety, to musi on sam zostać powiadomiony, że został oddany głos w ankiecie prawda? Schemat, który planowałem osiągnąć wygląda tak: [PHP] -> emit -> [WS] -> broadcast -> [Front-end]
Co prawda aktualnie ankiety się odświeżają co 5 sekund, ale chciałem jednocześnie osiągnąć efekt natychmiastowej aktualizacji po każdym oddaniu głosu.

Jakby kogoś interesowało to zrobiłem to przy użyciu: Ratchet + ZeroMQ + Autobahn

Ten post edytował nmts 8.04.2015, 11:50:29


--------------------
Free Web Tools - narzędzia dla programistów, webdeveloperów i specjalistów seo...
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 28.06.2025 - 21:36