Có rất nhiều hướng dẫn hay nói về loại
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS0 của Go và cách sử dụng nó để thực hiện các truy vấn và câu lệnh cơ sở dữ liệu SQL. Nhưng hầu hết chúng đều che đậy các phương pháp
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS1,
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS2 và
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS3 — mà bạn có thể sử dụng để định cấu hình hành vi của
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS0 và thay đổi hiệu suất của nó
Trong bài đăng này, tôi muốn giải thích chính xác chức năng của các cài đặt này và chứng minh tác động [tích cực và tiêu cực] mà chúng có thể gây ra
Kết nối mở và nhàn rỗi
Tôi sẽ bắt đầu với một nền tảng nhỏ
Đối tượng
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS0 là một nhóm nhiều kết nối cơ sở dữ liệu chứa cả kết nối 'đang sử dụng' và 'nhàn rỗi'. Một kết nối được đánh dấu là đang sử dụng khi bạn đang sử dụng nó để thực hiện một tác vụ cơ sở dữ liệu, chẳng hạn như thực thi một câu lệnh SQL hoặc truy vấn các hàng. Khi tác vụ hoàn thành, kết nối được đánh dấu là không hoạt động
Khi bạn hướng dẫn
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS0 thực hiện một tác vụ cơ sở dữ liệu, trước tiên, nó sẽ kiểm tra xem có bất kỳ kết nối nhàn rỗi nào đã có sẵn trong nhóm không. Nếu có sẵn thì Go sẽ sử dụng lại kết nối hiện có này và đánh dấu nó là đang sử dụng trong suốt thời gian thực hiện nhiệm vụ. Nếu không có kết nối nhàn rỗi nào trong nhóm khi bạn cần, thì Go sẽ tạo thêm một kết nối bổ sung mới
Phương thức SetMaxOpenConns
Theo mặc định, không có giới hạn về số lượng kết nối mở [đang sử dụng + không hoạt động] cùng một lúc. Nhưng bạn có thể thực hiện giới hạn của riêng mình thông qua phương pháp
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS1 như vậy
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS8
Trong mã ví dụ này, nhóm hiện có giới hạn tối đa là 5 kết nối mở đồng thời. Nếu tất cả 5 kết nối đã được đánh dấu là đang sử dụng và cần một kết nối mới khác, thì ứng dụng sẽ buộc phải đợi cho đến khi một trong 5 kết nối được giải phóng và trở nên nhàn rỗi
Để minh họa tác động của việc thay đổi
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS9, tôi đã chạy thử nghiệm điểm chuẩn với các kết nối mở tối đa được đặt thành 1, 2, 5, 10 và không giới hạn. Điểm chuẩn thực thi song song các câu lệnh
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS00 trên cơ sở dữ liệu PostgreSQL và bạn có thể tìm thấy mã trong ý chính này. Đây là kết quả
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS01
Chỉnh sửa. Để làm rõ, mục đích của điểm chuẩn này không phải là để mô phỏng hành vi 'đời thực' của một ứng dụng. Nó chỉ giúp minh họa cách
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS0 cư xử đằng sau hậu trường và tác động của việc thay đổi
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS9 đối với hành vi đó
Đối với điểm chuẩn này, chúng ta có thể thấy rằng càng cho phép nhiều kết nối mở thì càng mất ít thời gian để thực hiện
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS00 trên cơ sở dữ liệu [3129633 ns/op với 1 kết nối mở so với 531030 ns/op đối với kết nối không giới hạn — nhanh hơn khoảng 6 lần . Điều này là do càng nhiều kết nối mở được cho phép, càng có nhiều truy vấn cơ sở dữ liệu có thể được thực hiện đồng thời
Phương thức SetMaxIdleConns
Theo mặc định,
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS0 cho phép giữ lại tối đa 2 kết nối nhàn rỗi trong nhóm kết nối. Bạn có thể thay đổi điều này thông qua phương pháp
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS2 như vậy
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS07
Về lý thuyết, việc cho phép số lượng kết nối nhàn rỗi cao hơn trong nhóm sẽ cải thiện hiệu suất vì ít có khả năng phải thiết lập kết nối mới từ đầu — do đó giúp tiết kiệm tài nguyên
Hãy xem cùng một điểm chuẩn với các kết nối nhàn rỗi tối đa được đặt thành không, 1, 2, 5 và 10 [và số lượng kết nối mở là không giới hạn]
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS08
Khi
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS09 được đặt thành không, một kết nối mới phải được tạo từ đầu cho mỗi
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS00 và chúng tôi có thể thấy từ các điểm chuẩn rằng thời gian chạy trung bình và mức sử dụng bộ nhớ tương đối cao
Việc cho phép chỉ giữ lại và sử dụng lại 1 kết nối nhàn rỗi sẽ tạo ra sự khác biệt lớn đối với điểm chuẩn cụ thể này — nó cắt giảm thời gian chạy trung bình khoảng 8 lần và giảm mức sử dụng bộ nhớ khoảng 20 lần. Tiếp tục tăng kích thước của nhóm kết nối nhàn rỗi giúp hiệu suất thậm chí còn tốt hơn, mặc dù các cải tiến ít rõ rệt hơn
Vì vậy, bạn có nên duy trì một nhóm kết nối nhàn rỗi lớn không?
Điều quan trọng là phải nhận ra rằng việc duy trì một kết nối nhàn rỗi sẽ phải trả giá — nó chiếm bộ nhớ mà có thể được sử dụng cho cả ứng dụng và cơ sở dữ liệu của bạn
Cũng có thể nếu một kết nối không hoạt động quá lâu thì nó có thể không sử dụng được. Ví dụ: cài đặt
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS11 của MySQL sẽ tự động đóng mọi kết nối không được sử dụng trong 8 giờ [theo mặc định]
Khi điều này xảy ra,
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS0 sẽ xử lý nó một cách duyên dáng. Các kết nối không hợp lệ sẽ tự động được thử lại hai lần trước khi bỏ cuộc, tại thời điểm đó, Go sẽ xóa kết nối khỏi nhóm và tạo một kết nối mới. Vì vậy, đặt
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS09 quá cao thực sự có thể dẫn đến kết nối trở nên không sử dụng được và sử dụng nhiều tài nguyên hơn so với khi bạn có nhóm kết nối nhàn rỗi nhỏ hơn [với ít kết nối được sử dụng thường xuyên hơn]. Vì vậy, thực sự bạn chỉ muốn giữ kết nối không hoạt động nếu bạn có thể sẽ sớm sử dụng lại kết nối đó
Một điều cuối cùng cần chỉ ra là
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS09 phải luôn nhỏ hơn hoặc bằng
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS9. Go thực thi điều này và sẽ tự động giảm
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS09 nếu cần
Phương thức SetConnMaxLifetime
Bây giờ chúng ta hãy xem phương pháp
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS3 đặt thời lượng tối đa mà một kết nối có thể được sử dụng lại cho. Điều này có thể hữu ích nếu cơ sở dữ liệu SQL của bạn cũng triển khai thời gian tồn tại của kết nối tối đa hoặc nếu — ví dụ — bạn muốn tạo điều kiện thuận lợi cho việc hoán đổi cơ sở dữ liệu sau bộ cân bằng tải
Bạn sử dụng nó như thế này
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS18
Trong ví dụ này, tất cả các kết nối của chúng tôi sẽ 'hết hạn' sau 1 giờ kể từ khi chúng được tạo lần đầu tiên và không thể sử dụng lại sau khi chúng hết hạn. Nhưng lưu ý
- Điều này không đảm bảo rằng một kết nối sẽ tồn tại trong nhóm trong cả giờ;
- Một kết nối vẫn có thể được sử dụng hơn một giờ sau khi được tạo — nó không thể bắt đầu được sử dụng lại sau thời gian đó
- Đây không phải là thời gian chờ nhàn rỗi. Kết nối sẽ hết hạn sau 1 giờ kể từ khi được tạo lần đầu — không phải 1 giờ sau khi kết nối không hoạt động lần cuối
- Cứ sau mỗi giây, một thao tác dọn dẹp sẽ tự động chạy để xóa các kết nối 'đã hết hạn' khỏi nhóm
Về lý thuyết,
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS19 càng ngắn thì các kết nối sẽ hết hạn thường xuyên hơn — và do đó — chúng sẽ càng cần được tạo lại từ đầu thường xuyên hơn
Để minh họa điều này, tôi đã chạy điểm chuẩn với
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS19 được đặt thành 100ms, 200ms, 500ms, 1000ms và không giới hạn [được sử dụng lại mãi mãi], với cài đặt mặc định là kết nối mở không giới hạn và 2 kết nối nhàn rỗi. Những khoảng thời gian này rõ ràng là ngắn hơn nhiều so với bạn sử dụng trong hầu hết các ứng dụng nhưng chúng giúp minh họa tốt hành vi
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS11
Trong các điểm chuẩn cụ thể này, chúng ta có thể thấy rằng mức sử dụng bộ nhớ lớn hơn gấp 3 lần với thời gian tồn tại 100 mili giây so với thời gian tồn tại không giới hạn và thời gian chạy trung bình cho mỗi
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS00 cũng dài hơn một chút
Nếu bạn đặt
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS19 trong mã của mình, thì điều quan trọng là phải ghi nhớ tần suất mà các kết nối sẽ hết hạn [và sau đó được tạo lại]. Ví dụ: nếu bạn có tổng số 100 kết nối và thời gian 1 phút là 100, thì ứng dụng của bạn có khả năng hủy và tạo lại tối đa 1. 67 kết nối [trung bình] mỗi giây. Bạn không muốn tần số này lớn đến mức cuối cùng nó cản trở hiệu suất, thay vì giúp ích cho nó
Vượt quá giới hạn kết nối
Cuối cùng, bài viết này sẽ không đầy đủ nếu không đề cập đến điều gì sẽ xảy ra nếu bạn vượt quá giới hạn cứng về số lượng kết nối cơ sở dữ liệu
Để minh họa, tôi sẽ thay đổi tệp
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS15 của mình để chỉ cho phép tổng cộng 5 kết nối [mặc định là 100]
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS16
Và sau đó chạy lại bài kiểm tra điểm chuẩn với các kết nối mở không giới hạn
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS17
Ngay khi đạt đến giới hạn cứng là 5 kết nối, trình điều khiển cơ sở dữ liệu [pq] của tôi ngay lập tức trả về thông báo lỗi
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS18 thay vì hoàn thành
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS00
Để ngăn lỗi này, chúng tôi cần đặt tổng số kết nối mở tối đa [đang sử dụng + không hoạt động] trong
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS0 thành dưới 5. như vậy
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS11
Bây giờ sẽ chỉ có tối đa 3 kết nối được tạo bởi
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS0 tại bất kỳ thời điểm nào và điểm chuẩn sẽ chạy mà không có bất kỳ lỗi nào
Nhưng làm điều này đi kèm với một cảnh báo lớn. khi đạt đến giới hạn kết nối mở và tất cả các kết nối đang được sử dụng, mọi tác vụ cơ sở dữ liệu mới mà ứng dụng của bạn cần thực thi sẽ buộc phải đợi cho đến khi kết nối trở nên miễn phí và được đánh dấu là không hoạt động. Ví dụ: trong ngữ cảnh của một ứng dụng web, yêu cầu HTTP của người dùng sẽ bị 'treo' và thậm chí có khả năng hết thời gian trong khi chờ tác vụ cơ sở dữ liệu được chạy
Để giảm thiểu điều này, bạn phải luôn chuyển đối tượng
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS13 với thời gian chờ cố định, nhanh, khi thực hiện cuộc gọi cơ sở dữ liệu, sử dụng các phương thức hỗ trợ theo ngữ cảnh như
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS14. Một ví dụ có thể được nhìn thấy trong ý chính ở đây
Tóm tắt
- Theo nguyên tắc thông thường, bạn nên đặt giá trị
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS
9 một cách rõ ràng. Điều này phải thoải mái dưới bất kỳ giới hạn cứng nào về số lượng kết nối do cơ sở dữ liệu và cơ sở hạ tầng của bạn áp đặt - Nói chung, giá trị
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS
9 vàBenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS
09 cao hơn sẽ dẫn đến hiệu suất tốt hơn. Nhưng lợi nhuận đang giảm dần và bạn nên lưu ý rằng việc có một nhóm kết nối nhàn rỗi quá lớn [với các kết nối không được sử dụng lại và cuối cùng trở nên tồi tệ] thực sự có thể dẫn đến giảm hiệu suất - Để giảm thiểu rủi ro từ điểm 2 ở trên, bạn có thể đặt một khoảng thời gian tương đối ngắn là
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS
19. Nhưng bạn không muốn điều này quá ngắn dẫn đến các kết nối bị giết và được tạo lại thường xuyên một cách không cần thiết BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS
09 phải luôn nhỏ hơn hoặc bằngBenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS
9
Đối với các ứng dụng web vừa và nhỏ, tôi thường sử dụng các cài đặt sau làm điểm bắt đầu, sau đó tối ưu hóa từ đó tùy thuộc vào kết quả kiểm tra tải với mức thông lượng thực tế
BenchmarkMaxOpenConns1-8 500 3129633 ns/op 478 B/op 10 allocs/op BenchmarkMaxOpenConns2-8 1000 2181641 ns/op 470 B/op 10 allocs/op BenchmarkMaxOpenConns5-8 2000 859654 ns/op 493 B/op 10 allocs/op BenchmarkMaxOpenConns10-8 2000 545394 ns/op 510 B/op 10 allocs/op BenchmarkMaxOpenConnsUnlimited-8 2000 531030 ns/op 479 B/op 9 allocs/op PASS11
Nếu bạn thích bài viết này, bạn có thể muốn xem danh sách hướng dẫn được đề xuất của tôi hoặc xem sách của tôi Hãy bắt đầu và Hãy tiến xa hơn, cuốn sách dạy cho bạn mọi thứ bạn cần biết về cách xây dựng các ứng dụng web và API chuyên nghiệp sẵn sàng cho sản xuất với Go