2013-01-17 27 views
11

Người dùng của tôi thường thấy thời gian chờ yêu cầu trên Heroku. Thật không may tôi không thể tái tạo chúng một cách nhất quán mà làm cho họ thực sự khó khăn để gỡ lỗi. Có rất nhiều cơ hội để cải thiện hiệu suất - ví dụ: bằng cách giảm số lượng lớn các truy vấn cơ sở dữ liệu cho mỗi yêu cầu và bằng cách thêm bộ nhớ đệm khác - nhưng không có hồ sơ đó là ảnh chụp trong bóng tối.Cách định cấu hình thời gian chờ H12 không nhất quán trên Heroku

Theo phân tích Relic mới của chúng tôi, nhiều yêu cầu mất từ ​​1 đến 5 giây trên máy chủ. Tôi biết rằng quá chậm, nhưng nó không ở đâu gần 30 giây cần thiết cho thời gian chờ.

Tab lỗi trên Relic mới hiển thị cho tôi một số truy vấn cơ sở dữ liệu khác nhau trong đó thời gian chờ xảy ra, nhưng đây không phải là truy vấn đặc biệt chậm và có thể là các truy vấn khác nhau cho từng sự cố. Cũng cho cùng một URL đôi khi nó và đôi khi không hiển thị truy vấn cơ sở dữ liệu.

Làm cách nào để tìm hiểu điều gì đang xảy ra trong những trường hợp cụ thể này? Ví dụ. làm thế nào để tôi biết được bao nhiêu thời gian nó đã được chi tiêu trong cơ sở dữ liệu khi thời gian chờ xảy ra, như trái ngược với thời gian nó chi tiêu trong cơ sở dữ liệu khi không có lỗi?

Một giả thuyết tôi có là cơ sở dữ liệu bị khóa trong một số trường hợp; có lẽ là sự kết hợp giữa đọc và viết.

+0

Bạn đã xem nhật ký chưa?Lần tới vấn đề xảy ra, ngay lập tức đi đến dấu nhắc lệnh của bạn và nhập 'nhật ký heroku'. Đăng nhật ký từ lỗi sẽ giúp chúng tôi giải quyết vấn đề. –

+0

@BrianPetro Tôi có nhật ký, nhưng chúng khác nhau cho từng trường hợp - ngay cả trên cùng một trang - bởi vì nó chấm dứt một địa điểm khác mọi lúc. Đó là lý do tại sao tôi đang tìm một cách chung chung hơn để gỡ lỗi này. –

+0

Cập nhật bạn đăng với một số nhật ký hoặc mã có liên quan nhất. Nếu không tôi sợ tôi không thể giúp đỡ nhiều. –

Trả lời

7

Bạn có thể đã xem nó, nhưng Heroku có doc với một số nền tảng tốt về thời gian chờ yêu cầu.

Nếu yêu cầu của bạn mất nhiều thời gian và các quy trình phục vụ chúng không bị hủy trước khi yêu cầu hoàn tất, thì chúng sẽ tạo ra các dấu vết giao dịch sẽ cung cấp chi tiết về các giao dịch riêng lẻ mất quá nhiều thời gian. Nếu bạn đang sử dụng Unicorn, có thể điều này không xảy ra vì các yêu cầu mất nhiều thời gian để chúng chống lại số timeout của Unicorn (sau đó nhân viên phục vụ các yêu cầu đó sẽ bị buộc phải giết, không cho New Relic đủ thời gian để báo cáo lại).

tôi khuyên bạn nên một phương pháp hai bước:

  1. Cấu hình rack-timeout middleware để có một thời gian chờ dưới đây thời gian chờ 30 Heroku của. Nếu công trình này hoạt động, nó sẽ chấm dứt các yêu cầu mất nhiều thời gian hơn thời gian chờ bằng cách tăng Timeout::Error và các yêu cầu đó sẽ tạo ra các dấu vết giao dịch trong Relic mới.
  2. Nếu điều đó không có gì (có thể do thời gian chờ dựa trên lớp Timeout của Ruby, có some limitations), bạn có thể thử yêu cầu xử lý yêu cầu Unicorn hết thời gian chờ 60 giây (giả sử bạn đang sử dụng Unicorn). Lưu ý rằng các yêu cầu chạy dài sẽ buộc một nhân viên Unicorn trong một khoảng thời gian dài hơn trong trường hợp này, điều này có thể làm chậm trang web của bạn hơn, vì vậy hãy sử dụng điều này như một phương sách cuối cùng.
1

Hai năm sau tại đây. Tôi có ít kinh nghiệm với Ruby, nhưng đối với Django vấn đề với Gunicorn là nó không xử lý đúng các máy khách chậm trên Heroku vì các yêu cầu không được đệm trước, nghĩa là kết nối máy chủ có thể bị chờ đợi (chặn). This might be a helpful article to you, mặc dù nó áp dụng chủ yếu cho Gunicorn và Python.

Các vấn đề liên quan