Cách tránh lỗi hết thời gian chờ trong python

Lỗi H12 xảy ra khi yêu cầu HTTP mất hơn 30 giây để hoàn thành. Những lỗi này thường do

  • Yêu cầu chạy lâu, chẳng hạn như truy vấn đắt tiền hoặc lệnh gọi API bên ngoài chậm
  • Đồng thời không đủ dẫn đến thời gian xếp hàng yêu cầu cao khi lưu lượng truy cập tăng đột biến

Bài viết này bao gồm các bước cần thực hiện để giảm thiểu số lượng lỗi H12 trong ứng dụng của bạn

Nếu ứng dụng của bạn có nhiều lỗi H12, hãy xem phần Xử lý lỗi H12 (Hết thời gian yêu cầu) để biết các bước khắc phục ngay lập tức

 

Nếu các yêu cầu phải chạy lâu hơn 30 giây, Heroku hỗ trợ các tính năng như câu trả lời trực tuyến và bỏ phiếu dài cũng như WebSockets

Thêm thời gian chờ vào Máy chủ web

Bộ định tuyến Heroku loại bỏ một yêu cầu chạy dài sau 30 giây, nhưng dyno đằng sau nó tiếp tục xử lý yêu cầu cho đến khi hoàn thành. Việc thêm thời gian chờ đảm bảo rằng dyno loại bỏ yêu cầu chạy nhật ký thay vào đó và tạo không gian cho các yêu cầu khác

Đặt thời gian chờ trong ứng dụng trong khoảng 10-20 giây, càng thấp càng tốt mà không ảnh hưởng xấu đến người dùng của bạn. Dưới đây là gợi ý cho các ngôn ngữ cụ thể

  • Nút. js. Cài đặt nút. mô-đun thời gian chờ js. Nó đưa ra một ngoại lệ hết thời gian phản hồi
  • PHP. Đặt tùy chọn max_execution_time trong php.ini để buộc PHP dừng thực thi sau một khoảng thời gian. Giá trị mặc định là 30 giây
  • con trăn. Khi sử dụng Gunicorn, hãy giảm thời gian chờ so với mặc định là 30 giây
  • hồng ngọc. Sử dụng đá quý hết thời gian chờ. Sau khi vượt qua ngưỡng thời gian chờ, đá quý tăng ngoại lệ Rack::TimeoutError. Xem Thời gian chờ yêu cầu trong Ruby (MRI) để biết thêm mẹo

Giao dịch hết thời gian yêu cầu gỡ lỗi

Giá trị thời gian chờ của bộ định tuyến Heroku không thể định cấu hình. Để giảm thiểu lỗi H12, hãy xem xét và sửa mã chậm và sử dụng các công việc nền

Xác định độ chậm trong mã ứng dụng và cuộc gọi bên ngoài

Mặc dù Bảng điều khiển Heroku hiển thị một số chỉ số nhưng nó không cung cấp thông tin chi tiết cần thiết để chẩn đoán phần nào của yêu cầu mất nhiều thời gian nhất để hoàn thành. Sử dụng tiện ích bổ sung như Di tích mới hoặc tiện ích bổ sung theo dõi hiệu suất khác để theo dõi các giao dịch chậm

Tham khảo tài liệu của công cụ giám sát để tìm hiểu cách

  • Theo dõi các giao dịch ở phân vị thứ 99 và thời gian phản hồi tối đa. Nhắm đến thời gian phản hồi dưới 500 ms
  • Xác định các giao dịch vừa tốn thời gian vừa có thông lượng cao. Các giao dịch này có thể có tác động cao nhất đến hiệu suất tổng thể của ứng dụng
  • Xác định các giao dịch có thời gian phản hồi trung bình chậm nhất. Ngay cả khi có thông lượng thấp, giao dịch chậm vẫn có thể ảnh hưởng đến hiệu suất tổng thể. Các giao dịch chậm có thể giữ các khóa trong cơ sở dữ liệu, chẳng hạn như ngăn các truy vấn khác chạy
  • Lần theo dấu vết và thời gian cho các giao dịch này. Một số công cụ giám sát tự động ghi lại dấu vết giao dịch mẫu hoặc cung cấp khả năng chỉ định các giao dịch quan trọng để giám sát. Dấu vết giao dịch xác định thời gian mã cần để thực hiện một tác vụ, tương tác với cơ sở dữ liệu, gọi các API bên ngoài, v.v.

Sau khi bạn đã xác định được phần nào trong giao dịch chậm của mình đang gây ra tắc nghẽn, hãy thực hiện các bước để giảm thiểu tình trạng chậm đó. Ví dụ

  • Di chuyển các tác vụ chậm sang các tác vụ nền, chẳng hạn như tải tệp lên hoặc các tác vụ tính toán cao
  • Di chuyển các cuộc gọi bên ngoài chậm đến công việc nền. Nếu bạn không thể di chuyển cuộc gọi bên ngoài vào nền, hãy lập kế hoạch cho trường hợp thất bại. Bạn có thể chỉ định thời gian chờ cho các yêu cầu HTTP ở hầu hết các ngôn ngữ
  • Giải quyết các truy vấn chậm của bạn. Xem thêm thông tin về Xác định độ chậm trong cơ sở dữ liệu

Điều tra các phản hồi của Node JS

Nút. js không ngầm xử lý các yêu cầu bằng cách gửi phản hồi. Thay vào đó, các nhà phát triển phải tạo logic xử lý riêng. Kết quả là, một sự giám sát phổ biến trong Node. ứng dụng js là đường dẫn mã bị thiếu logic phản hồi

  1. Thêm nhật ký dọc theo mọi nhánh của tuyến đường bị lỗi, chẳng hạn như mỗi câu lệnh if và lời gọi hàm. Bao gồm tiêu đề x-request-id để thêm khả năng lọc nhật ký
  2. Tạo yêu cầu cho tuyến đường đó và tìm kiếm yêu cầu đó trong nhật ký. Bước thành công cuối cùng là gì?
  3. Tìm đường dẫn bên trong ứng dụng không tạo ra phản hồi thích hợp

Với Express, hãy sử dụng mẫu chuỗi trách nhiệm thay vì sử dụng một chức năng duy nhất có nhiều nhánh để giảm thiểu các lỗi logic này

Ví dụ, thay vì

app.*get*('/app/:id', doEverythingInOneBigFunctionWithAsyncBranches);

Sử dụng mô hình chuỗi trách nhiệm

app.get('/app/:id', checkUserAuth, findApp, renderView, sendJSON);

function checkUserAuth(req, res, next) {
  if (req.session.user) return next();
  return next(new NotAuthorizedError());
}

Mẫu trên bổ sung lợi ích của việc xử lý lỗi thống nhất thông qua ngăn xếp phần mềm trung gian lỗi

Xác định độ chậm trong cơ sở dữ liệu

Xem các truy vấn đắt tiền trong cơ sở dữ liệu tại dữ liệu. heroku. com. Chọn cơ sở dữ liệu từ danh sách và điều hướng đến tab Chẩn đoán của nó. Tìm kiếm trong nhật ký để tìm các tham số chính xác được chuyển đến các truy vấn này trong quá trình điều tra

Lệnh pg:outliers từ plugin Heroku pg-extras giúp tìm các truy vấn chậm. Chạy lệnh đó để tìm các truy vấn có tỷ lệ thời gian thực hiện cao. Việc thêm các chỉ mục bị thiếu thường là cách khắc phục nhanh đối với nhiều truy vấn chậm. Xem lại phần Truy vấn đắt tiền để biết thêm hướng dẫn xác định các truy vấn chậm trong Heroku Postgres và các mẹo khác để tối ưu hóa chúng

Xem lại phần Giám sát Heroku Postgres để xác định và giải quyết các sự cố hiệu suất cơ sở dữ liệu tiềm ẩn, chẳng hạn như khóa cơ sở dữ liệu và phình to

Tối ưu hóa đồng thời web

Đồng thời là xử lý nhiều yêu cầu cùng một lúc. Chia thành nhiều quy trình con hoặc sử dụng nhiều luồng làm tăng tính đồng thời. Nói chung, nhiều quy trình con hơn có nghĩa là sử dụng nhiều bộ nhớ hơn, trong khi nhiều luồng hơn có nghĩa là tải nhiều hơn trên dyno

Thu thập số liệu cơ bản

Xác định đồng thời web chính xác, số lượng và loại dynos là một nhiệm vụ không hề nhỏ đòi hỏi phải lặp lại liên tục. Thực hiện các quan sát về tải dyno và bộ nhớ để hiểu mức độ sử dụng tài nguyên dyno và liệu chúng có cao hơn hoặc thấp hơn các khuyến nghị của chúng tôi hay không. Trong Bảng điều khiển Heroku, trong tab Số liệu hoặc, nếu được kết nối, công cụ giám sát của ứng dụng, lưu ý tải dyno và mức sử dụng bộ nhớ trong bảy ngày qua. So sánh các số liệu này với các nguyên tắc được đề xuất

  • Xem Lượng tải dyno chấp nhận được là bao nhiêu?
  • Giữ mức sử dụng bộ nhớ tối đa dưới 85% hạn ngạch bộ nhớ. Xem lại giới hạn bộ nhớ cho loại dyno của ứng dụng

Tối ưu hóa việc sử dụng tài nguyên

Nếu các số liệu cơ bản của ứng dụng cho thấy các vấn đề về tải cao, hãy chuyển các tác vụ nặng của CPU sang các tác vụ nền

Xem lại các số liệu cơ bản về bộ nhớ. Tổng mức sử dụng bộ nhớ bao gồm RAM và bộ nhớ trao đổi. Nếu trao đổi đang được sử dụng hoặc các lỗi liên quan đến bộ nhớ R14 hoặc R15 được ghi lại, hãy kiểm tra rò rỉ bộ nhớ hoặc phình to. Người ta thường thấy một số trao đổi, ~50 MB trên Thời gian chạy chung. Không gian riêng tư dynos không hoán đổi bộ nhớ mà thay vào đó sẽ khởi động lại khi hết bộ nhớ. Xem R14 - Vượt quá hạn ngạch bộ nhớ trong Ruby (MRI) và Nút khắc phục sự cố. js Sử dụng bộ nhớ để có hướng dẫn cụ thể về điều tra việc sử dụng bộ nhớ trong các ngôn ngữ đó

Điều chỉnh và kiểm tra cài đặt đồng thời

Trước tiên, luôn điều chỉnh cài đặt đồng thời trong môi trường dàn dựng để kiểm tra chúng trước khi áp dụng chúng vào sản xuất

Sau khi tối ưu hóa các giao dịch chậm và sử dụng tài nguyên, hãy điều chỉnh cài đặt đồng thời. Mức đồng thời lý tưởng kết hợp thời gian phản hồi mong muốn trong khi vẫn nằm trong các nguyên tắc được đề xuất cho tải dyno và dưới hạn ngạch bộ nhớ 85%. Điều chỉnh đồng thời bằng cách thay đổi số lượng luồng, quy trình và dynos

  • Tăng tính đồng thời bằng cách tăng số lượng luồng. Tuy nhiên, nhiều chủ đề hơn dẫn đến tải dyno cao hơn
  • Tăng tính đồng thời bằng cách tăng số lượng quy trình. Tuy nhiên, nhiều quá trình tiêu thụ nhiều bộ nhớ hơn
  • Nếu bạn không thể tăng tính đồng thời bằng cách thêm nhiều luồng và quy trình hơn do tải dyno và giới hạn bộ nhớ
    • Tăng số lượng dynos đang chạy
    • Nâng cấp loại dyno. Dyno dung lượng cao hơn cung cấp thêm tài nguyên. Tăng số lượng luồng và quy trình từ đó
  • Giảm đồng thời bằng cách làm ngược lại với các gạch đầu dòng trước đó

Mặc dù mỗi ứng dụng là duy nhất, đây là thông tin thêm và cài đặt đồng thời mặc định được đề xuất cho một số ngôn ngữ

  • hồng ngọc. Sử dụng máy chủ web Puma, với nhiều quy trình và luồng. Mỗi quy trình hoặc luồng yêu cầu một kết nối khác với cơ sở dữ liệu. Trong Rails, ActiveRecord cung cấp một nhóm kết nối có thể chứa nhiều kết nối cùng một lúc. Xem Kết nối đồng thời và cơ sở dữ liệu trong Ruby với ActiveRecord để biết thêm thông tin
  • Nút. Nút là một luồng nhưng có thể rẽ nhánh nhiều quy trình để tối đa hóa tài nguyên có sẵn của chúng. Xem Tối ưu hóa nút. js Ứng dụng đồng thời để biết các mẹo cụ thể
  • con trăn. Gunicorn rẽ nhánh nhiều quy trình công nhân hệ thống trong mỗi dyno. Mỗi quy trình yêu cầu một kết nối khác với cơ sở dữ liệu. Đối với Django, hãy xem Kết nối đồng thời và cơ sở dữ liệu trong Django để biết các mẹo cụ thể
  • PHP. PHP-FPM sinh ra nhiều tiến trình con

Luôn kiểm tra các thay đổi đối với cài đặt đồng thời trong môi trường dàn dựng trước khi áp dụng chúng vào sản xuất. Kiểm tra thời gian phản hồi, tải dyno và mức sử dụng bộ nhớ trong quá trình thử nghiệm để giúp điều chỉnh đồng thời. Kiểm tra bằng cách sử dụng các mẫu lưu lượng truy cập khác nhau để xác định có bao nhiêu dyno đáp ứng nhu cầu lưu lượng truy cập cao, thấp và trung bình. Xem bài viết Kiểm tra tải để được hướng dẫn thêm

Kích hoạt hoặc điều chỉnh Autoscaling

Autoscaling cho phép số lượng web dynos tự động điều chỉnh. Kích hoạt tính năng tự động thay đổi quy mô khi thời gian phản hồi đạt đến ngưỡng giúp ngăn ngừa lỗi H12 vì tính năng này làm tăng tính đồng thời của web bằng cách thêm nhiều dynos. Chọn số lượng dynos tối thiểu và tối đa để chạy dựa trên các bài kiểm tra tải trước đó đối với các mẫu lưu lượng truy cập khác nhau. Luôn kiểm tra các thay đổi đối với cài đặt tự động thay đổi quy mô trong môi trường dàn dựng trước khi áp dụng chúng vào sản xuất. Xem Autoscaling để biết thêm thông tin

Rà soát định kỳ

Lên lịch đánh giá hàng quý hoặc hàng năm để thực hiện các bước trong bài viết này. Điều chỉnh tài nguyên một cách thích hợp trong các đánh giá này dựa trên cách mã và mẫu lưu lượng truy cập thay đổi

Điều gì gây ra lỗi hết thời gian chờ trong Python?

Lý do tạo thời gian chờ là do chương trình đang cố viết 50000 tài liệu cùng một lúc , SDK Python có giá trị mặc định . 5 giây. Có một vài lựa chọn ở đây. Tăng thời gian chờ. Giảm kích thước lô của nhiều hoạt động.

Làm cách nào để tránh ngoại lệ hết thời gian chờ trong Selenium Webdriver Python?

Giải pháp .
Bạn có thể tăng thời gian chờ theo cách thủ công bằng cách nhấn và dùng thử. Nếu sự cố vẫn tiếp diễn trong một khoảng thời gian dài hơn, có thể có một số vấn đề khác và bạn nên tiếp tục giải pháp tiếp theo
Bạn có thể thêm thời gian chờ một cách rõ ràng bằng cách sử dụng JavaScript Executor

Python có thời gian chờ không?

Sử dụng quy trình con để hết thời gian chờ lệnh bên ngoài . 5, có một API run() tiện dụng và được khuyên dùng trong mô-đun quy trình con, có hỗ trợ hết thời gian chờ tích hợp sẵn Since Python 3.5, there's a handy and recommended run() API in subprocess module, which has built-in timeout support . Khi hết thời gian, nó sẽ tăng ngoại lệ TimeoutExpired.