[pgsql-vn:16] Re: Hỗ trợ bug Npgsql.PostgresException (0x80004005): 53300: sorry, too many clients already

pgvn_support support tại postgresql.vn
CN 10 Th6 2018 04:53:09 EDT


Hi,

On 09/06/2018 9:07 CH, Trần Đức Thông wrote:
> Xin bạn,
>
> Mình hiện tại đang sử dụng PostgreSQL vào trong công việc. Tuy nhiên 
> hiện giờ mình gặp một bug mà chưa giải quyết được. Nhờ các bạn tư vấn 
> giúp. Chi tiết như sau
>
> Phiên bản PostgreSQL 10
>
> Mình có thực hiện một test như sau.
> 1. Tạo một Table có 4 cột, và insert vào đó 1120 bản ghi.
>
> 2. Viêt một web api sử dụng thư viện#Npgsql 
> <https://www.facebook.com/hashtag/npgsql?source=feed_text>tạo kết nối 
> đến db vào execute một function. Function này thực hiện một nhiệm vụ 
> đơn giản là trả ra hết các bản ghi của table trên.
>
> 3. Sử dụng jemeter load test vào function trên. Với tham số Number Of 
> Theard = 200, Ramp-Up = 0, Loop Count = 5.
>
> 4. Kết quả xảy ra lỗi "sorry, too many clients already" -> check trong 
> db thấy số connection đang mở là 105. Trong khi theo config của 
> PostgreSql max-connection = 100.
>
Số connections hiện tại trên PostgreSQL có thể xem từ view 
pg_stat_activity của PostgreSQL.

max_connections không tính số lượng worker process (như background 
worker, autovacuum launcher, ...).
Nên có trường hợp số lượng rows trong pg_stat_activity trả về giá trị 
lớn hơn max_connections.

Ở phiên bản 10, có một số connections không được tính cho 
max_connections cũng hiện thị trong pg_stat_activity như:
background writer, checkpointer, walwriter.
Nên giá trị connection đang mở có thể có giá trị 105 như bạn xác nhận.

> Mình không có nhiều kinh nghiệm với sql nên nhờ mọi người tư vấn giúp. 
> Với 2 câu hỏi như sau.
>
> 1. Tạo sao lại xảy ra hiện tượng mở nhiều connection (sao connection 
> pool k được dùng đến) trong chuỗi Connection string đã có tham số 
> Pooling = true
>

Chức năng connection pooling bạn nói là ở phía npgsql, không phải bên 
PostgreSQL.
Nên mình chỉ có thể trả lời khái quát như bên dưới.
Để tìm hiểu cụ thể bạn tham khảo documents (hoặc source) phía npgsql.

Thông thường vì PostgreSQL sử dụng mỗi process cho một kết nối,
nên ở một số Driver có chức năng pool connection (hoặc tạo kết nối trước 
(prefork))
để giảm overhead khi có kết nối mới.

Bạn có thể chỉnh số lượng connections pool ở phía driver.

> Câu 2. Tại sao khi postgresql đã max connection -> các request sau 
> không được được cho vào queue đợi khi thực khi xong các request hiện 
> tại mới tiếp tự thưc thi các request mới. Mà theo hiên tại postgresql 
> vẫn cố mở thêm conneciton mới dẫn đến xảy ra lỗi trên
>

Lỗi "sorry, too many clients already" là phía PostgreSQL trả về, khi số 
lượng kết nối yêu cầu lớn hơn max_connections.
but PostgreSQL không tự mở thêm kết nối. Mở kết nối là do phía npgsql.
PostgreSQL cũng không có cơ chế queue để chứa các kết nối.

Bạn nên xem lại hệ thống bạn có mở kết nối khác ngoài npgsql không (Ví 
dụ như cho mornitoring?) và
điều chỉnh lại max_connections (postgresql.conf) hoặc Max pool size 
(npgsql) cho đúng.

>
>
>
>
>
>> Nhờ các bạn tư vấn giúp.
>
> Mình xin cảm ơn.
> ------------------------------------------------------------------------------------------------- 
>
> *Tran Duc Thong*
> Software engineering
> Mobile: 0989 452 004
> Email: humg.thongit tại gmail.com <mailto:humg.thongit tại gmail.com>

Xin cảm ơn,
—
Together we work better
Cộng đồng PostgreSQL Việt Nam


━━━━━━phần kế tiếp━━━━━━
Một tập tin HTML đính kèm đã bị lau...
Địa chỉ URL: <https://www.postgresql.vn/mailman/private/pgsql-vn/attachments/20180610/f80714fa/attachment-0001.html>
━━━━━━phần kế tiếp━━━━━━
Một đồ đính kèm không phải văn bản đã bị lau...
Tên: 34774679_1820173794713440_1674413414325157888_n.jpg
Kiểu : image/jpeg
Kích cỡ : 16623 byte
Mô tả : hiện không có
URL : <https://www.postgresql.vn/mailman/private/pgsql-vn/attachments/20180610/f80714fa/attachment-0005.jpg>
━━━━━━phần kế tiếp━━━━━━
Một đồ đính kèm không phải văn bản đã bị lau...
Tên: 34776555_1820163938047759_3125179472001630208_n.jpg
Kiểu : image/jpeg
Kích cỡ : 25358 byte
Mô tả : hiện không có
URL : <https://www.postgresql.vn/mailman/private/pgsql-vn/attachments/20180610/f80714fa/attachment-0006.jpg>
━━━━━━phần kế tiếp━━━━━━
Một đồ đính kèm không phải văn bản đã bị lau...
Tên: 34815573_1820167161380770_7656883969492779008_n.jpg
Kiểu : image/jpeg
Kích cỡ : 37510 byte
Mô tả : hiện không có
URL : <https://www.postgresql.vn/mailman/private/pgsql-vn/attachments/20180610/f80714fa/attachment-0007.jpg>
━━━━━━phần kế tiếp━━━━━━
Một đồ đính kèm không phải văn bản đã bị lau...
Tên: 34838297_1820164721381014_2112880329151741952_n.jpg
Kiểu : image/jpeg
Kích cỡ : 26905 byte
Mô tả : hiện không có
URL : <https://www.postgresql.vn/mailman/private/pgsql-vn/attachments/20180610/f80714fa/attachment-0008.jpg>
━━━━━━phần kế tiếp━━━━━━
Một đồ đính kèm không phải văn bản đã bị lau...
Tên: 35049242_1820165204714299_6562859883991924736_n.jpg
Kiểu : image/jpeg
Kích cỡ : 26642 byte
Mô tả : hiện không có
URL : <https://www.postgresql.vn/mailman/private/pgsql-vn/attachments/20180610/f80714fa/attachment-0009.jpg>


Thông tin thêm về hộp thư chung pgsql-vn