몇 시간 동안 PostgreSQL 트랜잭션 커밋


11

약 4 시간 동안 실행되고 꽤 오랜 시간 동안 커밋 상태에 있었던 사용자에서 PostgreSQL 서버로 두 개의 연결이있는 문제가 발생했습니다 (최소한 1 시간 동안 보았습니다) . 이러한 연결은 다른 쿼리의 실행을 차단하지만 자체는 차단되지 않습니다.

문제가되는 두 가지 연결은 다음과 같습니다.

postgres=# select * from pg_stat_activity where usename = 'xxxxx';
 datid | datname | procpid | usesysid | usename | current_query | waiting |          xact_start           |          query_start          |         backend_start         |  client_addr  | client_port
-------+---------+---------+----------+---------+---------------+---------+-------------------------------+-------------------------------+-------------------------------+---------------+-------------
 20394 | xxxxxx  |   17509 |    94858 | xxxxx   | COMMIT        | f       | 2014-01-30 05:51:11.311363-05 | 2014-01-30 05:51:12.042515-05 | 2014-01-30 05:51:11.294444-05 | xx.xx.xxx.xxx |       63531
 20394 | xxxxxx  |    9593 |    94858 | xxxxx   | COMMIT        | f       | 2014-01-30 06:45:17.032651-05 | 2014-01-30 06:45:17.694533-05 | 2014-01-30 06:45:16.992576-05 | xx.xx.xxx.xxx |       63605

PID 9593은 다른 사용자가 이것에 의해 차단하는 가장 문제가있는 것입니다. 사용자가 인정하는 한, 그는 테이블을 자르고 각 배치 후에 1,000 커밋으로 배치를 삽입했습니다.

현재이 PID는 다음과 같은 잠금을 보여줍니다.

postgres=# select * from pg_locks where pid = 9593;
   locktype    | database | relation | page | tuple | virtualxid | transactionid | classid | objid | objsubid | virtualtransaction | pid  |        mode         | granted
---------------+----------+----------+------+-------+------------+---------------+---------+-------+----------+--------------------+------+---------------------+---------
 relation      |    20394 | 29173472 |      |       |            |               |         |       |          | 261/0              | 9593 | AccessExclusiveLock | t
 relation      |    20394 | 27794470 |      |       |            |               |         |       |          | 261/0              | 9593 | RowExclusiveLock    | t
 relation      |    20394 | 27794470 |      |       |            |               |         |       |          | 261/0              | 9593 | ShareLock           | t
 relation      |    20394 | 27794470 |      |       |            |               |         |       |          | 261/0              | 9593 | AccessExclusiveLock | t
 virtualxid    |          |          |      |       | 261/503292 |               |         |       |          | 261/0              | 9593 | ExclusiveLock       | t
 transactionid |          |          |      |       |            |     503213304 |         |       |          | 261/0              | 9593 | ExclusiveLock       | t

이 PID를 죽일 수 없습니다 (kill 명령을 실행할 때 아무 일도 일어나지 않습니다). 나는 이것을 더 진단하고 분명히 해결하기 위해 무엇을 해야할지 모르겠습니다.

누구든지 입력 하시겠습니까?

Ubuntu Linux 서버에서 PostgreSQL 8.4 실행

편집하다:

커밋이 중단 된 상태와 비슷한 상태에서 다른 연결을 찾았을 때 서버 로그에서 다음을 더 자세히 살펴 보았습니다.

Jan 30 02:29:45 server001 kernel: [3521062.240540] postgres      D 0000000000000000     0 23220   8154 0x00000004
Jan 30 02:29:45 server001 kernel: [3521062.240550]  ffff8800174c9d08 0000000000000082 ffff88041cd24728 0000000000015880
Jan 30 02:29:45 server001 kernel: [3521062.240559]  ffff8806c678b110 0000000000015880 0000000000015880 0000000000015880
Jan 30 02:29:45 server001 kernel: [3521062.240567]  0000000000015880 ffff8806c678b110 0000000000015880 0000000000015880
Jan 30 02:29:45 server001 kernel: [3521062.240575] Call Trace:
Jan 30 02:29:45 server001 kernel: [3521062.240582]  [<ffffffff810da010>] ? sync_page+0x0/0x50
Jan 30 02:29:45 server001 kernel: [3521062.240590]  [<ffffffff81528488>] io_schedule+0x28/0x40
Jan 30 02:29:45 server001 kernel: [3521062.240596]  [<ffffffff810da04d>] sync_page+0x3d/0x50
Jan 30 02:29:45 server001 kernel: [3521062.240603]  [<ffffffff815289a7>] __wait_on_bit+0x57/0x80
Jan 30 02:29:45 server001 kernel: [3521062.240610]  [<ffffffff810da1be>] wait_on_page_bit+0x6e/0x80
Jan 30 02:29:45 server001 kernel: [3521062.240618]  [<ffffffff81078540>] ? wake_bit_function+0x0/0x40
Jan 30 02:29:45 server001 kernel: [3521062.240627]  [<ffffffff810e4480>] ? pagevec_lookup_tag+0x20/0x30
Jan 30 02:29:45 server001 kernel: [3521062.240634]  [<ffffffff810da665>] wait_on_page_writeback_range+0xf5/0x190
Jan 30 02:29:45 server001 kernel: [3521062.240644]  [<ffffffff81053668>] ? try_to_wake_up+0x118/0x340
Jan 30 02:29:45 server001 kernel: [3521062.240651]  [<ffffffff810da727>] filemap_fdatawait+0x27/0x30
Jan 30 02:29:45 server001 kernel: [3521062.240659]  [<ffffffff811431b4>] vfs_fsync+0xa4/0xf0
Jan 30 02:29:45 server001 kernel: [3521062.240667]  [<ffffffff81143239>] do_fsync+0x39/0x60
Jan 30 02:29:45 server001 kernel: [3521062.240674]  [<ffffffff8114328b>] sys_fsync+0xb/0x10
Jan 30 02:29:45 server001 kernel: [3521062.240682]  [<ffffffff81012042>] system_call_fastpath+0x16/0x1b

높은 I / O로드 후 비슷한 항목을 보았습니다. 운이 좋지 않은지 아니면 실제로 어떤 연결인지 확실하지 않습니다.
— frlan

2
서버의 디스크 또는 I / O 하위 시스템 오류가 의심됩니다.
— Craig Ringer

@CraigRinger-당신이 옳다고 생각합니다. 이상한 점은 오전 2시에 로그 파일에 이러한 경고가 표시되고 그 이후로 하루 종일 로그에 더 많은 메시지가 표시되지 않는다는 것입니다. 그러나 PostgreSQL이 이러한 결함으로부터 복구되지 않은 것처럼 데이터베이스 연결이 여전히 중단됩니다. OS 및 오늘 밤 (4 세 커널 실행) 업데이트를하려고합니다.
— ETL

@ETL 점검 dmesg– I / O 오류, 시간 초과, HBA 오류 등을 찾으십시오. 새로운 백업을 수행하고 디스크, 급습 서브 시스템 등을 확인하십시오.
— Craig Ringer

postgres D ... call trace printk와 같은 또 다른 메시지가 필요합니다. 예를 들어 CPU 잠금, 120 초 이상 프로세스가 멈춤 등이 있습니다. 추적은 문제가 무엇인지 더 명확하게 나타냅니다. 이미 상당히 명확합니다-fsync (2)처럼 보입니다. 기본 장치가 고장 났거나 너무 느리게 보입니까?
— Josip Rodin

답변:


1

이후 버전 9.4 및 완전히 새로운 서버로 업그레이드하여 더 이상 디버깅 할 수 없습니다. 그러나 나는 문제가 드라이브에 있다고 믿습니다. 기계에 의해 불량으로보고되지 않은 불량 드라이브를 발견했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.