XGallery – Bài toán queues và workers trên VPS Hostvn

Trước khi vô bài này thì mình share trước con supervisor hiện tại

[program:default-worker]
process_name=%(program_name)s_%(process_num)02d
command=/usr/bin/php /home/soulevil/www/XGallery/artisan queue:work --tries=5
autostart=true
autorestart=true
user=soulevil
numprocs=6
redirect_stderr=true
stdout_logfile=/home/soulevil/www/XGallery/storage/logs/default-worker.log
stopwaitsecs=3600

[program:downloads-worker]
process_name=%(program_name)s_%(process_num)02d
command=/usr/bin/php /home/soulevil/www/XGallery/artisan queue:work --queue=downloads --tries=5
autostart=true
autorestart=true
user=soulevil
numprocs=4
redirect_stderr=true
stdout_logfile=/home/soulevil/www/XGallery/storage/logs/downloads-worker.log
stopwaitsecs=3600

[program:batdongsan-worker]
process_name=%(program_name)s_%(process_num)02d
command=/usr/bin/php /home/soulevil/www/XGallery/artisan queue:work --queue=batdongsan --tries=5
autostart=true
autorestart=true
user=soulevil
numprocs=4
redirect_stderr=true
stdout_logfile=/home/soulevil/www/XGallery/storage/logs/batdongsan-worker.log
stopwaitsecs=3600

[program:truyenchon-worker]
process_name=%(program_name)s_%(process_num)02d
command=/usr/bin/php /home/soulevil/www/XGallery/artisan queue:work --queue=truyenchon --tries=5
autostart=true
autorestart=true
user=soulevil
numprocs=4
redirect_stderr=true
stdout_logfile=/home/soulevil/www/XGallery/storage/logs/truyenchon-worker.log
stopwaitsecs=3600

[program:flickr-worker]
process_name=%(program_name)s_%(process_num)02d
command=/usr/bin/php /home/soulevil/www/XGallery/artisan queue:work --queue=flickr --tries=5
autostart=true
autorestart=true
user=soulevil
numprocs=2
redirect_stderr=true
stdout_logfile=/home/soulevil/www/XGallery/storage/logs/flickr-worker.log
stopwaitsecs=3600

[program:limited-worker]
process_name=%(program_name)s_%(process_num)02d
command=/usr/bin/php /home/soulevil/www/XGallery/artisan queue:work --queue=limited --tries=5
autostart=true
autorestart=true
user=soulevil
numprocs=2
redirect_stderr=true
stdout_logfile=/home/soulevil/www/XGallery/storage/logs/limited-worker.log
stopwaitsecs=3600

Tổng cộng là 22 workers !

Oki ! Mình có 2 môi trường

VPS ( Hostvn )

  • 2 Cores
  • 2GB RAM
  • Cache & Queues trên Redis
  • Mongodb xài Atlas
  • MySQL local
  • 12 workers

VMWare trên Alienware

  • 2 processors x 4 cores
  • 8GB RAM
  • Cache trên Redis
  • Queues trên MySQL ( Vì sao mình sẽ giải thích sau )
  • Mongodb local
  • MySQL local
  • 22 workers

Gần 20 ngày chạy trên VPS data cứ cảm giác bị thiếu thiếu

Lượng data có được quá chậm, quá ít. 2 ngày chỉ có được khoảng 300-400 films.

Khá khó để kiểm chứng, đối chiếu. 1 phần do không có UI ( Redis )

Vậy câu chuyện vui là gì

Thật sự mình không rõ vì sao. Tự nhiên mất tiền mà không được gì ( con VPS & thêm 1 CPU ~ 500k / tháng ).

Nên setup thử trên con Alienware laptop ở nhà để đối chiếu. Sử dụng MySQL làm queues vì có phpmyadmin để kiểm tra jobs. Cái này do hạn hẹp kiến thức chỉ biết làm cách này. Còn Queues trên Redis thì … ngu luôn.

Kết quả kiểm tra queues trên phpMyAdmin
  • Số lượng job sinh ra quá lớn !. Mới chỉ có ~ 1-2 hours mà đã gần 100k job.
  • Nên dĩ nhiên trên VPS workers không kham kịp là điều dễ hiểu.

Ah tiện thể bài toán xử lý deadline Queues trên database tham khảo ở đây nhe

https://ph4r05.deadcode.me/blog/2017/12/23/laravel-queues-optimization.html

Oki ! Như vậy về cơ bản code đã ok. Chẳng qua do jobs nhiều quá thôi. Mới init thì nhiều là đúng ( và tốt ) rồi.

Vậy có thể an tâm chuyển jobs về Redis ( performance ).

Ah tất nhiên con Mongodb nhớ đánh Index … ! Vì flickr_photos table ( collection ) này có ít nhất cũng vài M records lận. Không đánh index là Mongo chạy 100% luôn. Rút kinh nghiệm khi ban đầu xài Mongodb trên VPS luôn.

Như vậy con XGallery này khi triển khai hoàn chỉnh thiết nghĩ sẽ tạm có mô hình sau

  • Khoảng 30 workers
    • Chắc cần chia nhỏ workers ra các queues khác để mọi thứ song song hơn
    • 1 con VPS độc lập
  • Mongo chắc vẫn sẽ chọn Atlas. Tuy nhiên FREE thì chỉ được max database 500MB. Quá nhỏ
  • MySQL 1 con server riêng nho nhỏ thôi vì thật ra connections k quá cao.
  • 1 con VPS nhỏ làm redis server để cache. Việc này khá cần vì nếu không dễ tạo flood trên target. Hoặc file cache cũng được. Cái này không quá gây ảnh hưởng performance
  • Queues sử dụng redis cho performance tốt hơn. Do đó 1 con Queue server riêng. Chưa thử xài Amazon.

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Blog at WordPress.com.

Up ↑

%d bloggers like this: