Postmaster sử dụng quá nhiều CPU và đĩa ghi


9

sử dụng PostgreSQL 9.1.2

Tôi đang thấy việc sử dụng CPU quá mức và số lượng lớn ghi vào đĩa từ các tác vụ của người quản lý bưu điện. Điều này xảy ra ngay cả khi ứng dụng của tôi không làm gì cả (10 giây chèn mỗi PHÚT). Có một số lượng hợp lý các kết nối mở tuy nhiên.

Tôi đã cố gắng xác định những gì trong ứng dụng của tôi gây ra điều này. Tôi khá mới với postgresql và chưa đi đến đâu. Tôi đã bật một số tùy chọn ghi nhật ký trong tệp cấu hình của mình và xem xét các kết nối trong bảng pg_stat_activity, nhưng tất cả đều không hoạt động. Tuy nhiên, mỗi kết nối tiêu thụ ~ 50% CPU và ghi ~ 15M / s vào đĩa (không đọc gì).

Về cơ bản, tôi đang sử dụng stock postgresql.conf với rất ít điều chỉnh. Tôi đánh giá cao bất kỳ lời khuyên hoặc gợi ý về những gì tôi có thể làm để theo dõi điều này.

Đây là một ví dụ về những gì top / iotop đang hiển thị cho tôi:

Cpu(s): 18.9%us, 14.4%sy,  0.0%ni, 53.4%id, 11.8%wa,  0.0%hi,  1.5%si,  0.0%st
Mem:  32865916k total,  7263720k used, 25602196k free,   575608k buffers
Swap: 16777208k total,        0k used, 16777208k free,  4464212k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                          
17057 postgres  20   0  236m  33m  13m R 45.0  0.1  73:48.78 postmaster                                                                                                                       
17188 postgres  20   0  219m  15m  11m R 42.3  0.0  61:45.57 postmaster                                                                                                                       
17963 postgres  20   0  219m  16m  11m R 42.3  0.1  27:15.01 postmaster                                                                                                                       
17084 postgres  20   0  219m  15m  11m S 41.7  0.0  63:13.64 postmaster                                                                                                                       
17964 postgres  20   0  219m  17m  12m R 41.7  0.1  27:23.28 postmaster                                                                                                                       
18688 postgres  20   0  219m  15m  11m R 41.3  0.0  63:46.81 postmaster                                                                                                                       
17088 postgres  20   0  226m  24m  12m R 41.0  0.1  64:39.63 postmaster                                                                                                                       
24767 postgres  20   0  219m  17m  12m R 41.0  0.1  24:39.24 postmaster                                                                                                                       
18660 postgres  20   0  219m  14m 9.9m S 40.7  0.0  60:51.52 postmaster                                                                                                                       
18664 postgres  20   0  218m  15m  11m S 40.7  0.0  61:39.61 postmaster                                                                                                                       
17962 postgres  20   0  222m  19m  11m S 40.3  0.1  11:48.79 postmaster                                                                                                                       
18671 postgres  20   0  219m  14m   9m S 39.4  0.0  60:53.21 postmaster                                                                                                                       
26168 postgres  20   0  219m  15m  10m S 38.4  0.0  59:04.55 postmaster  


Total DISK READ: 0.00 B/s | Total DISK WRITE: 195.97 M/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                                                                                                                        
17962 be/4 postgres    0.00 B/s   14.83 M/s  0.00 %  0.25 % postgres: aggw aggw [local] idle
17084 be/4 postgres    0.00 B/s   15.53 M/s  0.00 %  0.24 % postgres: aggw aggw [local] idle
17963 be/4 postgres    0.00 B/s   15.00 M/s  0.00 %  0.24 % postgres: aggw aggw [local] idle
17188 be/4 postgres    0.00 B/s   14.80 M/s  0.00 %  0.24 % postgres: aggw aggw [local] idle
17964 be/4 postgres    0.00 B/s   15.50 M/s  0.00 %  0.24 % postgres: aggw aggw [local] idle
18664 be/4 postgres    0.00 B/s   15.13 M/s  0.00 %  0.23 % postgres: aggw aggw [local] idle
17088 be/4 postgres    0.00 B/s   14.71 M/s  0.00 %  0.13 % postgres: aggw aggw [local] idle
18688 be/4 postgres    0.00 B/s   14.72 M/s  0.00 %  0.00 % postgres: aggw aggw [local] idle
24767 be/4 postgres    0.00 B/s   14.93 M/s  0.00 %  0.00 % postgres: aggw aggw [local] idle
18671 be/4 postgres    0.00 B/s   16.14 M/s  0.00 %  0.00 % postgres: aggw aggw [local] idle
17057 be/4 postgres    0.00 B/s   13.58 M/s  0.00 %  0.00 % postgres: aggw aggw [local] idle
26168 be/4 postgres    0.00 B/s   15.50 M/s  0.00 %  0.00 % postgres: aggw aggw [local] idle
18660 be/4 postgres    0.00 B/s   15.85 M/s  0.00 %  0.00 % postgres: aggw aggw [local] idle

Cập nhật : Rất nhiều tệp ghi dường như là một số tệp tạm thời (?) Trong thư mục $ PG_DATA / base /. Sự hiểu biết của tôi về cấu trúc tệp ở đây là mỗi bảng về cơ bản được lưu trữ dưới dạng một tệp có tên là OID của bảng. Tuy nhiên, có hàng tấn tệp được đặt tên tnn_nnnnnnnvà chính những tệp này dường như được ghi vào (có lẽ được ghi lại) liên tục. Những tập tin này để làm gì? Có ~ 4700 tệp và tất cả đều có kích thước 8K:

-rw-------. 1 postgres postgres     8192 Jul  3 23:08 t12_1430975
-rw-------. 1 postgres postgres     8192 Jul  3 23:08 t16_1432736
-rw-------. 1 postgres postgres     8192 Jul  3 23:08 t28_1439066
-rw-------. 1 postgres postgres     8192 Jul  3 23:08 t24_1436243
-rw-------. 1 postgres postgres     8192 Jul  3 23:08 t24_1436210
-rw-------. 1 postgres postgres     8192 Jul  3 23:08 t19_1393372
-rw-------. 1 postgres postgres     8192 Jul  3 23:08 t28_1439051
-rw-------. 1 postgres postgres     8192 Jul  3 23:08 t8_1430334

Cập nhật : Chạy strace trên các quy trình postmaster về cơ bản hiển thị rất nhiều tập tin I / O:

open("base/16388/t24_1435947_fsm", O_RDWR) = -1 ENOENT (No such file or directory)
open("base/16388/t24_1435947_vm", O_RDWR) = -1 ENOENT (No such file or directory)
open("base/16388/t24_1435947", O_RDWR)  = 9
lseek(9, 0, SEEK_END)                   = 8192
ftruncate(9, 0)                         = 0
lseek(9, 0, SEEK_END)                   = 0
open("base/16388/t24_1435941", O_RDWR)  = 18
lseek(18, 0, SEEK_END)                  = 0
write(9, "\0\0\0\0\0\0\0\0\1\0\0\0000\0\360\37\360\37\4 \0\0\0\0b1\5\0\2\0\0\0"..., 8192) = 8192
lseek(18, 0, SEEK_END)                  = 0
close(9)                                = 0
open("base/16388/t24_1435947", O_RDWR)  = 9
lseek(9, 0, SEEK_END)                   = 8192
close(18)                               = 0
close(9)                                = 0
open("base/16388/t24_1435944_fsm", O_RDWR) = -1 ENOENT (No such file or directory)
open("base/16388/t24_1435944_vm", O_RDWR) = -1 ENOENT (No such file or directory)
open("base/16388/t24_1435944", O_RDWR)  = 9
lseek(9, 0, SEEK_END)                   = 0
close(9)                                = 0

Cập nhật : Vì vậy, vấn đề này dường như là tất cả để làm với các bảng tạm thời. Chúng tôi đã thay đổi thiết lập của mình để các bảng tạm thời là các bảng 'thông thường' và tất cả hoạt động của đĩa đều biến mất và hiệu suất trở lại như tôi mong đợi. Bây giờ, thay đổi này chỉ là một thử nghiệm nhanh và bẩn: nếu chúng ta thực sự sẽ thay đổi để sử dụng các bảng thông thường, chúng ta có vấn đề với đồng thời và dọn dẹp. Là những cái bàn tạm thời thực sự xấu xa, hay chúng ta đang lạm dụng chúng?

Cập nhật : Một số nền tảng. Tôi đang sử dụng một phần mềm trung gian nhân rộng dựa trên tuyên bố phát triển nội bộ . Nó khá trưởng thành và đã được sử dụng cho một số dự án trong một số năm, nhưng sử dụng MySQL. Chúng tôi chỉ làm việc với PostgreSQL trong một hoặc hai năm qua. Chúng tôi chủ yếu sử dụng các bảng tạm thời như là một phần của cơ chế sao chép. Bất cứ khi nào một kết nối mới được thiết lập, chúng tôi tạo một bảng tạm thời cho mỗi bảng trong cơ sở dữ liệu. Với 10-20 kết nối (tồn tại lâu) và ~ 50 bảng, điều này có thể lên tới rất nhiều bảng tạm thời. Tất cả các bảng tạm thời đã được tạo với:

CREATE TEMPORARY TABLE... ON COMMIT DELETE ROWS;

Các ngữ nghĩa của các bảng tạm thời rất phù hợp với sơ đồ sao chép của chúng tôi và đơn giản hóa rất nhiều mã chúng tôi phải sử dụng cho MySQL, nhưng có vẻ như việc triển khai cũng không công bằng. Từ một chút nghiên cứu tôi đã thực hiện, tôi không nghĩ các bảng tạm thời thực sự có ý nghĩa đối với chức năng mà chúng tôi đang sử dụng chúng cho.

Tôi không phải là chuyên gia nội bộ (thậm chí không gần gũi) về chủ đề này, chỉ là người dùng nó, vì vậy lời giải thích của tôi có thể không chính xác 100%, nhưng tôi nghĩ nó khá gần.


3
Sự hiểu biết của bạn hơi lỗi thời, nếu bạn xem tài liệu chính thức , bạn sẽ thấy rằng "... đối với các mối quan hệ tạm thời, tên tệp có dạng tBBB_FFF, trong đó BBB là ID phụ trợ của phụ trợ đã tạo tệp và FFF là số tên tệp. ... "
Milen A. Radev

Wow, đó là một hệ thống con I / O đĩa hoạt động tốt. Strace nói gì về những gì công nhân đang làm?
womble

@ MilenA.Radev, vì vậy có vẻ như tôi có thể đang làm điều gì đó kỳ lạ / quá mức với các bảng tạm thời. Hay đấy. Tôi có rất nhiều kích hoạt tại chỗ sử dụng các bảng tạm thời. Tôi sẽ xem xét kỹ hơn về những điều này.
sói lâu

@womble, tôi đã cập nhật câu hỏi với đầu ra từ strace.
sói lâu

Bạn đang thực sự gặp một vấn đề hiệu suất?
voretaq7

Câu trả lời:


1

Cấu hình PostgreSQL của bạn đã tắt. Điều này đáng ngờ từ bài viết ban đầu của bạn,

 Cpu(s): 18.9%us, 14.4%sy,  0.0%ni, 53.4%id, 11.8%wa,  0.0%hi,  1.5%si,  0.0%st
 Mem:  32865916k total,  7263720k used, 25602196k free,   575608k buffers
 Swap: 16777208k total,        0k used, 16777208k free,  4464212k cached

Trong số 32 GB trên máy chủ của bạn, ~ 25 GB là miễn phí, ngoại trừ ~ 575 MB bộ đệm.

Từ tệp postgresql.conf của bạn,

 shared_buffers = 32MB                   # min 128kB                               
 #temp_buffers = 8MB                     # min 800kB
 #max_prepared_transactions = 0          # zero disables the feature
 ...
 #work_mem = 1MB                         # min 64kB
 #maintenance_work_mem = 16MB            # min 1MB
 #max_stack_depth = 2MB   

Tôi cho rằng đây là một cơ sở dữ liệu chuyên dụng. Nếu vậy, thay đổi nó thành các tham số sau và tải lại / khởi động lại,

 shared_buffers = 16GB                   # min 128kB                               
 temp_buffers = 128MB                     # min 800kB
 #max_prepared_transactions = 0          # zero disables the feature
 ...
 work_mem = 8MB                         # min 64kB
 maintenance_work_mem = 64MB            # min 1MB
 max_stack_depth = 4MB   

Hãy cho tôi biết làm thế nào điều này thay đổi hiệu suất của bạn và có thể điều chỉnh thêm khi cần thiết.

Trân trọng các bảng chưa được đăng ký, nếu các bảng tạm thời của bạn chứa dữ liệu tạm thời là phù du và, như bạn đã đề cập, được tạo trên phiên, tốt hơn là sử dụng các bảng chưa được lưu.

Bạn có thể cắt ngắn bảng bài của mình nếu điều đó được chấp nhận.

Thêm thông tin ở đây - http://michael.otacoo.com/postgresql-2/unlogged-table-performance-in-postgresql-9-1/

Tôi không chắc tại sao bạn cần bảng tạm thời để nhân rộng. Bạn không thể sử dụng bản sao phát trực tuyến PostgreSQL?


0

Sử dụng các bảng tạm thời và có các kết nối lâu dài (có thể liên quan đến việc kết nối) có thể là một gánh nặng nếu máy chủ của bạn không được chuẩn bị. Một tham số PostgreSQL bạn có thể thử chơi là temp_buffersđiều khiển RAM được phân bổ cho các bảng tạm thời. Các bộ đệm tạm thời được phân bổ cho mỗi kết nối và giá trị mặc định (8MB) có thể quá thấp cho trang web của bạn.

Có thể bạn cũng cần thay đổi một chút hành vi của ứng dụng khách của mình, tùy thuộc vào cách bạn sử dụng các bảng tạm thời của mình. Có một câu hỏi tương tự với một câu trả lời hay trên Stack Overflow .


Tôi sẽ phải hỏi chuyên gia nội bộ về việc chúng tôi đã thử điều chỉnh giá trị temp_buffers hay chưa (chúng tôi đã thử rất nhiều thứ khác nhau). Câu hỏi bạn chỉ ra không thực sự áp dụng vì chúng tôi không sử dụng các bảng tạm thời theo cách đó. Tôi đã cập nhật câu hỏi với một số chi tiết.
sói lâu

Cảm ơn bạn đã cập nhật câu hỏi và cho tệp postgresql.conf, đó là những gì chúng tôi cần cố gắng cải thiện trong tình huống này. Tôi đồng ý với câu trả lời @Chida phù hợp với nội dung tôi đề xuất temp_buffers. Bạn cũng có thể cho chúng tôi biết kích thước của DB mà bạn đang cố gắng sao chép không? Có bao nhiêu bảng, kích thước trung bình trên mỗi bảng và tổng kích thước của DB?
Tonin

0

Bạn có thể gửi tập tin postgresql.conf của bạn? Postgresql của bạn dường như được tối ưu hóa đáng kể.

Bạn cũng có thể đăng:

  • Nếu bạn đang sử dụng các bảng chưa được đăng ký cho các bảng tạm thời của bạn?

  • Có bao nhiêu đĩa và trong cấu hình RAID nào?


Tôi đã đặt tập tin postgresql.conf tại đây . Tôi tin rằng bạn không thể tạo một bảng vừa tạm thời vừa không bị khóa. Có 6 đĩa 1TB trong RAID 1 + 0 (tổng dung lượng 3TB)
wolfcastle
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.