2011-03-01 5 views
1

우리는 JBoss에서 PostgreSQL 8.0.9를 데이터베이스로 사용하는 Java EE 웹 응용 프로그램을 실행하고 있습니다.PostgreSQL 프로세스 Hanguch

응용 프로그램의 한 페이지가로드 될 때 크고 복잡한 쿼리가 실행됩니다. 요청한 페이지가 클라이언트에 반환되기 전에 사용자가이 페이지를 요청하고 브라우저 창을 닫으면 문제가 발생했습니다. 문제는 창을 닫으면 새로운 PostgreSQL 스레드/프로세스 (상단에서 볼 수 있음)가 생성되고 새 스레드/프로세스는 SELECT에서 유휴 출력으로 전환하는 데 오랜 시간이 걸릴 것이라고했습니다. 약 5 명 이상의 사용자가 생성 한 경우 (생성 된 큰 복잡한 쿼리 페이지가 클라이언트에 반환되기 전에 브라우저 창을 닫음) 작은 창에서 스폰 된 스레드/프로세스가 증가하고 유휴 상태 (SELECT 상태로 유지)로 전환하지 않고 CPU가 많이 발생하여 주요 성능 문제가 발생합니다. 브라우저 창을 닫은 사용자가 로그 아웃하면 연결된 스레드/프로세스가 유휴 상태로 전환되고 CPU 사용량이 감소한다는 사실을 언급하는 것이 중요합니다. 또한 JBoss가 다시 시작되면 적용 가능한 스레드/프로세스가 유휴 상태로 전환됩니다 (모든 사용자가 재시작으로 로그 아웃 됨).

걸려있는 스레드/프로세스의 문제는 데이터베이스 백업 및 RESTORE로 해결 된 것 같습니다. 이제 생성 된 새로운 스레드/프로세스는 일반적으로 짧은 기간에 SELECT에서 유휴 상태로 전환되며 CPU는 그만큼 부담을받지 않습니다. 또한 대규모의 복잡한 쿼리에 대한 성능은 RESTORE 이후로 크게 향상 된 것으로 보입니다.

데이터베이스에서 24 시간마다 VACUUM을 실행합니다. 데이터 손상 위험 때문에 데이터베이스에서 REINDEX를 실행하지 않습니다. 우리는 iostat 결과물, 특히 위에 설명 된 성능 문제의 경우에 오히려 높은 수치를 갖는 경향이 있습니다.

데이터베이스가 덤프되고 복원 될 때 (예 : REINDEX 등) 어떤 일이 발생합니까? 이것들 중 어느 것이 우리 솔루션의 열쇠 인 것처럼 보입니까?

복잡한 쿼리가 많은 페이지가 클라이언트에 반환되기 전에 브라우저 창이 닫힐 때 생성되는 스레드/프로세스 수를 관리하는 설정이 있습니까? SELECT에서 유휴 상태로 스레드/프로세스를 전환하는 것을 관리하는 설정이 있습니까? 애플리케이션 레벨에서 이들 중 하나를 관리 할 수 ​​있습니까?

답변

2

버전 8.0은 이미 EOL이고 버전 8.0.9는 오랫동안 패치되지 않았습니다. 8.0.26이 마지막 버전입니다. 많은 패치가 누락되어 있고 적어도 최신 8.0 버전으로 업데이트해야하며 아직 지원되는 버전으로 마이그레이션을 시작해야합니다. 버전 8.2 및 8.3부터 성능이 훨씬 향상되었습니다.

질문 : 왜 REINDEX가 귀하의 데이터를 손상 시켰다고 생각합니까? 데이터가 손상되면이 말은 쓸모 없게됩니다 ... REINDEX는 당신이 매일하는 일이 아니지만 때로는 필요합니다.

+0

프랭크, 답장을 보내 주셔서 감사합니다. 우리의 목표는 다른 버전의 PostgreSQL을 사용하는 것이지만 우리는 아직 존재하지 않습니다. 새로운 PostgreSQL 버전을 위해 응용 프로그램을 준비하는 동안 우리는 지금 할 수있는 것을 알아 내려고 노력하고 있습니다. REINDEX에 관해서 우리는 REINDEX를 실행하고있는 사람들로부터 PostgreSQL 포럼과 다른 곳에서 많은 게시물을 보았고 뭔가 잘못되었다고 봅니다. 아마도이 사람들은 REINDEX를 올바르게 실행하지 않았고 데이터가 손상되었을 것입니다. – Chuck

+0

버전 8.0.26에 대한 업데이트는별로 중요하지 않습니다. 단지 설치를하고 pg_ctl을 사용하여 다시 시작하십시오. 그게 전부 야. 이전에 백업을 만들었지 만 이는 정상입니다. 최신 8.2 릴리스로의 업그레이드 또한 큰 프로젝트가 아니며 8.3 이후 버전은 변경으로 인해 더 큰 영향을 미칠 수 있습니다. 패치가 교수형 문제를 해결했는지 알아 보려면 출시 노트를 확인하십시오. –