Zbyt duże obciążenie CPU na prostej aplikacji?

Cześć,

wziąłem testowo najtańszy serwer na Digital Ocean (1 rdzeń, 512 MB RAM) i chciałem zobaczyć, z czym sobie poradzi. Stworzyłem na scaffoldzie aplikację pozwalającą na tworzenie postów na blogu (title, content), nie zmieniałem css, nie dodawałem bootstrapa itd. itp. No i tu małe zdziwienie/przerażenie z mojej strony, bo po odpaleniu serwera i podglądnięciu htopem okazuje się, że serwer ma obciążenie do 10% CPU gdy jedna osoba (ja) przegląda tą aplikację w przeglądarce.

Czy to nie aby za dużo? Zużycie pamięci 450/490, swap włączony, nie grzebałem nic w konfiguracji - korzystam z istniejącego dropleta Rails z DO.

To mi pokazuje htop:

1251 root 20 0 713M 118M 3136 S 0.0 24.2 0:00.13 /usr/local/rvm/rubies/ruby-2.2.1/bin/ruby bin/rails s
1247 root 20 0 713M 118M 3136 S 0.0 24.2 0:06.20 /usr/local/rvm/rubies/ruby-2.2.1/bin/ruby bin/rails s
1249 root 20 0 713M 118M 3136 S 0.0 24.2 0:00.00 /usr/local/rvm/rubies/ruby-2.2.1/bin/ruby bin/rails s
994 rails 20 0 190M 72948 2840 S 0.0 14.5 0:00.00 unicorn worker[0] -D -c /etc/unicorn.conf -E production
990 rails 20 0 190M 72948 2840 S 0.0 14.5 0:02.00 unicorn worker[0] -D -c /etc/unicorn.conf -E production
1000 rails 20 0 190M 72796 2680 S 0.0 14.5 0:00.00 unicorn worker[2] -D -c /etc/unicorn.conf -E production
995 rails 20 0 190M 72796 2680 S 0.0 14.5 0:02.03 unicorn worker[2] -D -c /etc/unicorn.conf -E production
997 rails 20 0 189M 70328 444 S 0.0 14.0 0:00.00 unicorn worker[1] -D -c /etc/unicorn.conf -E production
992 rails 20 0 189M 70328 444 S 0.0 14.0 0:01.96 unicorn worker[1] -D -c /etc/unicorn.conf -E production
1001 rails 20 0 189M 70248 380 S 0.0 14.0 0:00.00 unicorn worker[3] -D -c /etc/unicorn.conf -E production
998 rails 20 0 189M 70248 380 S 0.0 14.0 0:01.97 unicorn worker[3] -D -c /etc/unicorn.conf -E production
921 postgres 20 0 241M 11076 10584 S 0.0 2.2 0:00.05 /usr/lib/postgresql/9.3/bin/postgres -D /var/lib/postgresql/9.3/main -c config_file=/etc/postgresql/9.3/main/p
999 root 20 0 77764 10744 464 S 0.0 2.1 0:00.00 unicorn master -D -c /etc/unicorn.conf -E production
987 root 20 0 77764 10744 464 S 0.0 2.1 0:00.01 unicorn master -D -c /etc/unicorn.conf -E production
1308 root 20 0 26400 6540 696 S 0.0 1.3 0:00.10 -bash
1150 root 20 0 26424 5876 4 S 0.0 1.2 0:00.13 -bash
1690 root 20 0 26596 2864 1392 R 0.7 0.6 0:03.87 htop
963 www-data 20 0 86160 1976 544 S 0.0 0.4 0:00.00 nginx: worker process
927 postgres 20 0 242M 1748 592 S 0.0 0.3 0:00.02 postgres: autovacuum launcher process
964 www-data 20 0 86160 1432 0 S 0.0 0.3 0:00.03 nginx: worker process
962 www-data 20 0 86160 1432 0 S 0.0 0.3 0:00.04 nginx: worker process
961 www-data 20 0 86160 1432 0 S 0.0 0.3 0:00.04 nginx: worker process
925 postgres 20 0 241M 1360 812 S 0.0 0.3 0:00.04 postgres: writer process
1258 root 20 0 103M 1248 252 S 0.0 0.2 0:00.10 sshd: root@pts/1
1099 root 20 0 103M 1168 172 S 0.0 0.2 0:00.08 sshd: root@pts/0
960 root 20 0 85880 1132 0 S 0.0 0.2 0:00.00 nginx: master process /usr/sbin/nginx
1 root 20 0 33488 944 0 S 0.0 0.2 0:01.17 /sbin/init
928 postgres 20 0 101M 820 244 S 0.0 0.2 0:00.02 postgres: stats collector process
926 postgres 20 0 241M 612 64 S 0.0 0.1 0:00.01 postgres: wal writer process
924 postgres 20 0 241M 536 4 S 0.0 0.1 0:00.00 postgres: checkpointer process
879 root 20 0 23652 268 164 S 0.0 0.1 0:00.00 cron
761 syslog 20 0 249M 204 32 S 0.0 0.0 0:00.00 rsyslogd
762 syslog 20 0 249M 204 32 S 0.0 0.0 0:00.00 rsyslogd
763 syslog 20 0 249M 204 32 S 0.0 0.0 0:00.01 rsyslogd
759 syslog 20 0 249M 204 32 S 0.0 0.0 0:00.01 rsyslogd
705 messagebu 20 0 39224 188 0 S 0.0 0.0 0:00.02 dbus-daemon --system --fork
760 root 20 0 43448 172 4 S 0.0 0.0 0:00.00 /lib/systemd/systemd-logind
1068 root 20 0 15816 164 4 S 0.0 0.0 0:00.00 /sbin/getty -8 38400 tty1
873 root 20 0 61364 136 0 S 0.0 0.0 0:00.00 /usr/sbin/sshd -D
847 root 20 0 15816 28 4 S 0.0 0.0 0:00.00 /sbin/getty -8 38400 tty3
849 root 20 0 15816 24 4 S 0.0 0.0 0:00.00 /sbin/getty -8 38400 tty6
880 daemon 20 0 19136 12 0 S 0.0 0.0 0:00.00 atd
783 root 20 0 15272 8 0 S 0.0 0.0 0:00.01 upstart-file-bridge --daemon
838 root 20 0 15816 8 4 S 0.0 0.0 0:00.00 /sbin/getty -8 38400 tty4

Nie ma w tym nic dziwnego. Chwilowe zużycie procesora nie mówi za wiele. Gdyby nie operacje I/O to przez czas wykonywania żądania oczekiwałbym 100% zużycia CPU. Kwestia jest inna. Pytanie ile żądań/s obsłuży Ci ten serwer. Musiałbyś sobie zrobić jakieś benchmarki żeby mieć jakieś oczekiwania co do tego ile użytkowników będzie w stanie ten serwer uciągnąć. Opieranie się na 1 użytkowniku i chwilowym zużyciu procesora po prostu nie ma sensu.

Użyłem siege z 50 użytkownikami i potrafiło zadławić serwer bardzo mocno. Może to bardziej kwestia tego, że wszystko ‘leci’ przez serwer railsowy zamiast przez jakiś web server (unicorn?)?

Pytanie tylko, czy to jest prawidłowa droga rozumowania? Może lepiej zrobić 2-3 droplety po 512 RAMu (rails, web server, db)? Czy wszystko może być ciągnięte przez jeden taki mały serwerek? Nie buduję drugiego facebooka, chcę się czegoś nauczyć po prostu i szukam informacji od osób z większym doświadczeniem.

Ja Ci mogę doradzić ze swojego niewielkiego doświadczenia, że zmiana servera z Webricka poprawi performance. Unicorna używałem i różnica duża nie była , lecz w przypadku passengera wydajność wzrosła znacznie.

1 Like

Jestem w trakcie walki z unicornem i nginxem właśnie :slight_smile: Jak się nie uda, to spróbuję passengera w dalszej kolejności.

Ktoś ma może jeszcze jakieś pomysły/rady?

Napisz może jaki masz obecny setup. Na froncie masz nginx/apache? Appkę jak odpalasz? (bin/rails s, unicorn coś innego?)

Z logów wyczytuję że ma nginx+unicorn. To jest bardzo dobry setup, nie wydaje mi się żebyś musiał zmieniać na passengera, @cenebris

Może tu jest jakiś błąd - odpalałem poprzez komendę rails server (bez żadnych dodatków, więc prawdopodobnie nawet w trybie development, nie production).

Po zapuszczeniu siege unicorn i nginx były na 0 procent CPU, jedyne co skakało to właśnie ten rails server. Także na razie bawię się ze zmianą na unicorn+nginx i zobaczę, co wtedy siege i htop powiedzą.