nginx load chậm

Discussion in 'Hỏi Đáp Kỹ Thuật' started by sincos, Nov 7, 2021.

  1. sincos

    sincos Bang Chúng

    Mình có 1 con server làm backend.... chả có gì trên đó chỉ toàn ảnh..... bình thường thì không sao nhưng khi load cao 1 chút > 5000 connection thì xuất hiện tình trang load rất chậm.

    1 Cái ảnh 2-300kb thôi mà load hàng chục giây.... Mình kiểm tra CPU load rất thấp, I/O thì cũng chỉ < 20MB/s....

    Không hiểu sao thằng nginx nó chậm như vậy? @xmenvn2510 @firefox @money..... mấy anh em có cao kiến gì không? Giúp phát.

    Vài cấu hình của mình đây:

    Code:
    worker_processes 16;
    worker_rlimit_nofile 100000;
    worker_connections 5000;
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
     
  2. loyki

    loyki Bang Chúng

    Media nhiều thì xài apache đi bác
     
  3. sincos

    sincos Bang Chúng

    Bác có thể chia sẻ thêm lý do hoặc trải nghiệm tại sao lại chuyển sang dùng Apache được không?
     
  4. xmenvn2510

    xmenvn2510 Moderator + MiddleMan Staff Member

    Thấy bồ đang để worker_connections 5000;
    Bạn tăng lên xem sao.
    Nginx bạn có moniter không?
     
  5. money

    money Hương Chủ

    Em dùng thẻ img để show ảnh hay dùng code đọc ảnh để show? —> nếu dùng code đọc ảnh thì check lại code thử
    Và con server đó port như thế nào? —> nếu port nhỏ (thường server storage hay dùng port nhỏ) sẽ làm chậm tốc độ transfer ảnh. Em tính toán thử với lượng traffic lúc cao điểm nhân với dung lượng trung bình mỗi ảnh để xem thử thế nào. Hoặc server có thống kê network i/o, em so sánh thử.
     
  6. Phan Thị

    Phan Thị Bang Chúng

    Thím run cái này xem có dc ko
    echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
    echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
    sysctl -p
     
  7. sincos

    sincos Bang Chúng

    Tăng thử lên 10000 mà cũng không ổn bác ợ. Không biết nó bị thắt nút cổ chai ở đâu luôn. Ngồi 2 hôm rồi mà chưa ra. Mình thử log access xem $request_time bao nhiêu.... Toàn 20-30 giây khi connection > 3K trở lên.

    Request localhost cũng chậm nên ko thể đổ tại port dc.

    Không anh.... chỉ đơn giản là server file static toàn ảnh để web load thôi.... không sử lý gì hết.

    Không dc bác ợ.
     
    Last edited: Nov 7, 2021
  8. money

    money Hương Chủ

    vậy còn port ??? Khả năng là nâng cấp server sẽ hết. Đô la thần chưởng :D
     
  9. sincos

    sincos Bang Chúng

    Port 1 GBps em test rồi.... ổn anh.... em nghi I/O thì phải.... dùng lệnh test hình như Linux bây giờ nó fake I/O bằng cách ghi tạm vào RAM rồi sync xuống HDD sau...

    Còn khi traffic thật nó load 1 lượng lớn file thật thì 20MB/s là quá tải.
     
  10. fixbug

    fixbug Moderator Staff Member

    Có khi do network không bác. Rõ nhất là bác cài zabix, monitor nginix, network, disk io các thứ, check lúc bị ngẽn là ra thôi
     
  11. sincos

    sincos Bang Chúng

    Chắc là không vì test link http://localhost luôn trên server vẫn bị.
     
  12. money

    money Hương Chủ

    Em dùng lệnh test như nào? Nếu test với tham số bs lớn quá thì không chuẩn đâu vì đọc/ghi trong thực tế có bao giờ bs lớn như vậy, toàn tính bằng vài trăm KB thôi. Nên tes tốc độ ổ cứng anh hay dùng bs nhỏ và tăng số count lên.

    Trước anh có dùng 1 con server của Hetzner 4TB chứa ảnh. Khi traffic nhiều (tầm 10h đêm đến 3h sáng VN) nó cũng request rất lâu, khoảng 20-30s. Thậm chí có khi đến 80s mới load xong. Trong khi RAM chỉ hết 1/2 và CPU khoảng 60%. Fixed mãi chẳng được, anh copy nguyên con đó sang 1 con server nữa giống y vậy và chia tải ra làm 2 thì lại load phà phà. Về kỹ thuật thì anh không làm gì cả, chỉ là anh code đọc ảnh theo mô hình: visitor request đến web trên 1 server A --> web đọc ảnh từ con server HN rồi trả về. Giờ anh cho 2 con server chứa ảnh, request đến thì đếm giây: chẵn --> đọc ảnh từ server HN1, lẻ --> đọc ảnh từ server HN2.
     
  13. sincos

    sincos Bang Chúng

    @money em vừa sync kho data hơn 2 triệu ảnh đêm qua sang server mới của nhà cung cấp khác thì tình hình cải thiện rõ rệt anh ạ......

    Từ đây có thể rút ra khi test I/O của server nếu dùng lệnh
    Code:
    dd if=/dev/zero of=/10GB bs=1024 count=10240k
    Hoặc chỉ test với lượng file ít thì không chính xác. Em không có thời gian tìm hiểu sâu là tại sao nhưng em nghi ngờ Kernel nó có cơ chế nào đó khi ghi đọc file nó sẽ ghi tạm vào RAM và sync dần xuống ổ cứng sau. ==> khi test file cả chục GB vẫn thấy speed nhanh > 500MB/s. Nhưng với điều kiện việc ghi đọc không liên tục, Kernel sẽ lấy lúc rảnh rỗi bù lại để sync xuống ở cứng thật.

    Khi đó có 1 hệ lụy nếu khi chạy hệ thống chạy thật => việc ghi đọc file sảy ra liên tục => thoái trào => không có thời gian rảnh rỗi để Kernel có thể bù đắp lúc ghi đọc quá tải.

    Trước đây em có nghi ngờ tại sao HDD mà speed I/O có thể đạt cả GB/giây rất vô lý..... nếu là SSD đi chăng nữa mà ko dùng raid thì cũng chưa dc nửa con số đó.
     
  14. quoc nguyen

    quoc nguyen Sơ Nhập Giang Hồ

    Khả năng cao là do limit của IOPS chứ ko phải do port mạng đâu bác ạ. ổ HDD thì nó có IOPS rất thấp, chuyển qua SSD là khác bọt liền. Nghe bác nói IO tầm 20mb thì em đoán bác có 2 ổ HDD 7200rpm config raid0 hoặc 4 ổ HDD config raid10 (1+0)

    nói về random I/O performance thì ổ 7200rpm có thể đọc tối đa 7200 lần trong 1 phút. (rpm là read per minute) - tức là tầm khoảng 120 IOPS mà thoi, so với SSD thì con số này quá thấp.

    Raid0 lên thì random read với block 4KB dc tàm 120 * 2 * 4 = 1MB/s
    Kéo lên tầm 20MB như kia thì là do nó có kèm sequential read nữa chứ true random read thì ko quá 1MB dc vì còn chưa tính seek time, và latency vào đấy.

    => ổ cứng là bottlenet trong case này của bác. Lên SSD thôi !
     
    Nai, thitgaluoc, tungbo@ and 4 others like this.
  15. sincos

    sincos Bang Chúng

    Cụ @quoc nguyen có kiến thức sâu nè.... cho hỏi có tool nào test random read/write của ổ cứng vậy......
     
  16. quoc nguyen

    quoc nguyen Sơ Nhập Giang Hồ

  17. money

    money Hương Chủ

    @sincos chạy như em test thì tốc độ nhanh. Nó vừa ghi tuần tự lại vừa xài cache rồi cuối cùng mới ghi HDD.
    Thử lệnh này là khác bọt liền:
    dd if=/dev/zero of=/1G.tmp bs=1024 count=1024k status=progress oflag=direct conv=fsync
     
    sincos likes this.
  18. sincos

    sincos Bang Chúng

    Anh có thể giải thích tí được không? Chứ lệnh này em test nó sao sao á..... VPS server đểu thì dc tầm 2-3MB/s........... server raid 10 em mới build và giải quyết vụ I/O tốt thì dc có mấy tăm kb/s.

    {beat_plaster}
     
  19. money

    money Hương Chủ

    Là do anh đọc bài này:

    io - Is It OK to use oflag=direct and conv=fsync together in dd? - Unix & Linux Stack Exchange

    Đại khái là muốn ghi trực tiếp xuống ổ cứng, bỏ qua cache và cơ chế writeback gì đó của OS.

    Anh hay test như vậy và SSD thì luôn nhanh hơn HDD. Server lởm nhưng dùng SSD thì vẫn nhanh hơn là server xịn dùng HDD.

    Như hình dưới, anh test trên 1 con VPS Contabo dùng SSD thường (chưa phải NVMe) và 1 con Hetzner HDD 7200rpm RAID 0.

    upload_2021-11-8_21-53-27.png
    --- Double Post Merged, Nov 8, 2021, Original Post Date: Nov 8, 2021 ---
    Còn đây là 1 con server dùng SSD NVMe.

    upload_2021-11-8_21-56-49.png
    --- Double Post Merged, Nov 8, 2021 ---
    À nhân tiện thì dù em dùng RAID 10 vẫn ko cải thiện tốc độ ghi so với RAID 0 đâu nhé :D Đọc thì nhanh hơn (theo lý thuyết là gấp đôi thì phải) nhưng không thể bằng SSD. Tốn tiền hơn, an toàn data hơn 1 chút nhưng mà ảnh thì ko cần tốn nhiều tiền thế đâu. Thà chơi RAID 0 rồi còn tiền dư thuê con server khác backup.
     
  20. xmenvn2510

    xmenvn2510 Moderator + MiddleMan Staff Member

    Lệnh này là read hay write là ngẫu nhiên đó bồ @sincos
     
    money likes this.