Bế tắc thực hành tốt nhất


7

Chúng tôi đang chạy Postgres 9.3 và đôi khi chúng tôi gặp sự cố bế tắc. Hiện tại có người thông báo và sẽ tự hủy bỏ các quy trình. Có một thực hành tốt nhất trong việc đối phó với những điều này khi chúng xảy ra? Tôi biết có một statement_timeout, lock_timeoutdeadlock_timeoutnhưng hầu hết những nơi tôi đọc trạng thái mà bạn không muốn thiết lập này trong postgres.conftập tin.

Chỉ muốn xem liệu có một phương pháp thực hành điển hình / tốt nhất cho việc này. Có vẻ như đặt deadlock_timeout thành một cái gì đó như 10 phút là đủ, nhưng tôi muốn chắc chắn rằng mình không thiếu một số thứ quan trọng như tại sao đó lại là một ý tưởng tồi.


IIRC với việc để tất cả các cài đặt này ở mặc định tương ứng, các bế tắc tự giải quyết khá nhanh. Phải có một cái nhìn gần hơn về nhật ký của chúng tôi để nói một cái gì đó cụ thể hơn. Tuy nhiên, xử lý các bế tắc luôn được thực hiện tốt hơn bằng cách đảm bảo rằng tất cả các truy vấn xử lý đầu vào của chúng theo cùng một thứ tự - có nghĩa là không cố gắng giải quyết các bế tắc khi chúng xảy ra mà ngăn chặn chúng.
dezso

1
@dezso Tôi nghi ngờ một quan niệm sai lầm giữa khối chạy dài và bế tắc. Bế tắc thường không cho bàn hỗ trợ thời gian để giết trình chặn (đã chọn) và thường hiển thị lỗi cho người dùng, các trình chặn chạy dài là một thứ khác
Tom V - thử topanswers.xyz

Đi qua mã là một cái gì đó cần phải được thực hiện chắc chắn và đang được thực hiện mặc dù chậm. Tôi đã tìm kiếm thứ gì đó trong thời gian ngắn sẽ giết chết các phiên khi chúng bị treo. Tôi có thể nói về khối chạy dài, hai câu lệnh bị treo và sẽ không kết thúc nếu không có câu lệnh kia. Người dùng chỉ cần có một bánh xe quay khi điều đó xảy ra.
Toolman21

Trong trường hợp bế tắc thực sự , Postgres sẽ tự động giết một trong số họ. Tôi đồng ý với Tom rằng rất có thể bạn không gặp phải tình huống bế tắc khi bạn phải tự mình giết các phiên.
a_horse_with_no_name

Câu trả lời:


5

10 phút là một cài đặt cực kỳ cao deadlock_timeout, cũng có thể giải thích lý do tại sao bạn thậm chí có cơ hội can thiệp bằng tay. mặc định là 1 giây và hướng dẫn sử dụng :

Mặc định là một giây ( 1s), có lẽ là về giá trị nhỏ nhất bạn muốn trong thực tế. Trên một máy chủ tải nặng, bạn có thể muốn nâng nó lên. Lý tưởng nhất là cài đặt vượt quá thời gian giao dịch thông thường của bạn, để cải thiện tỷ lệ cược sẽ được giải phóng trước khi người phục vụ quyết định kiểm tra bế tắc. Chỉ có siêu nhân mới có thể thay đổi cài đặt này.

Tôi không mong đợi các giao dịch thông thường của bạn vượt quá 10 phút . Hãy thử một cái gì đó như 20 giây nếu bạn có các truy vấn chạy dài .

Cách phòng thủ tốt nhất trước những bế tắc cũng được ghi lại ở đây :

Bảo vệ tốt nhất chống lại bế tắc nói chung là để tránh chúng bằng cách chắc chắn rằng tất cả các ứng dụng sử dụng cơ sở dữ liệu đều có khóa trên nhiều đối tượng theo một thứ tự nhất quán.

Nếu bạn làm điều này do đó, không có cơ hội cho một bế tắc.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.