Opracowałem mini serwer HTTP w C++, używając instrukcji boost :: asio, a teraz testuję go na wielu klientach i nie byłem w stanie zbliżyć się do nasycania procesor. Testuję na instancji Amazon EC2 i uzyskuję około 50% wykorzystania jednego procesora, 20% innego, a pozostałe dwa są bezczynne (zgodnie z htopem).Serwer Socket C++ - Nie można nasycić procesora
Szczegóły:
- Lampa serwer się jednego wątku na rdzeń
- Wnioski są odbierane, analizowane, przetwarzane i odpowiedzi są wypisywane
- wnioski są dla danych, które są odczytywane z pamięć (tylko do odczytu dla tego testu)
- Jestem "ładowanie" serwera za pomocą dwóch maszyn, z których każda działa aplikacja java, działa 25 wątków, wysyłanie żądań
- Widzę około 230 żądań na sekundę ughput (to aplikacyjne wnioski, które składają się z wielu żądań HTTP)
Więc co mam patrzeć, aby poprawić ten wynik? Biorąc pod uwagę, że procesor jest w większości bezczynny, chciałbym wykorzystać tę dodatkową pojemność, aby uzyskać wyższą przepustowość, powiedzmy 800 żądań/s lub cokolwiek innego.
Pomysły miałem:
- Wnioski są bardzo małe, a często spełnione w ciągu kilku ms, mogę zmodyfikować klienta do wysyłania/skomponować większe żądania (być może za pomocą dozownika)
- I czy można zmodyfikować serwer HTTP tak, aby używał wzoru Wybierz, czy jest to odpowiednie tutaj?
- mogłem zrobić kilka profili, aby spróbować zrozumieć jakie są wąskim gardłem użytkownika/jest
Czy można założyć, że masz port 1Gbps na serwerze? Jakie są twoje żądania i rozmiary odpowiedzi (na drucie)? – nik
Jakie jest wykorzystanie przepustowości na porcie sieciowym serwera (ten, który zakładam jako 1Gbps)? – nik
Test działa na EC2, który jak sądzę wykorzystuje gigabit. Bmon zgłasza około 3 MB (megabity, jak sądzę) stawki TX i stawki 2,5Mib RX. Wiele rozmiarów żądań/odpowiedzi jest niewielkich (zaledwie 100 bajtów), ale niektóre odpowiedzi wynoszą do 1mb, żądania prawdopodobnie wynoszą do .25mb. –