Mendiagnosis kesalahan ruang disk rendah dari PostgreSQL meskipun penggunaan disk rendah


3

Saya memiliki aplikasi web Django menggunakan database PostgreSQL 9.3, yang kadang-kadang melempar kesalahan:

File "/usr/local/my_site/.env/lib/python2.7/site-packages/django/db/utils.py", line 94, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/usr/local/my_site/.env/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
OperationalError: could not write block 2432320 of temporary file: No space left on device
HINT:  Perhaps out of disk space?

Ini berjalan pada EC2 / RDS dan saya tidak dapat menemukan apa pun yang rendah pada ruang disk. Mesin virtual EC2 memiliki drive 9GB yang hanya menggunakan 38%. Basis data RDS PostgreSQL memiliki penyimpanan 20GB yang hampir 1% digunakan. Saya pikir ini mungkin masalah inode rendah pada contoh EC2, tetapi df -imenunjukkan bahwa hanya 33% yang digunakan.

Apa yang menyebabkan kesalahan ini?


Bisakah Anda menjalankan sesuatu seperti sysdig -p '%fd.name' proc.name contains WHATEVERYOURAPPISCALLEDuntuk melihat apa yang terlibat dalam filepath?
thrig

Jawaban:


9

Anda mendapatkan kesalahan ini karena PostgreSQL kehabisan ruang untuk menulis file sementara. Anda memiliki setidaknya satu permintaan yang menyebabkan database untuk sesekali menulis tabel sementara yang terlalu besar untuk ruang yang tersedia.

Secara default postgresql menggunakan string kosong untuk temp_tablespaceskonfigurasi; yang berarti bahwa tabel sementara ditulis ke dalam tablespace default (AKA $ DATA_DIR Anda). Karena Anda menggunakan RDS Postgres, Anda harus melihat apa yang dikatakan pengaturan itu gunakan

select * from pg_settings where name='temp_tablespaces';

Mengingat posisi blok yang disebutkan dan menggunakan RDS blocksize 8192. Sepertinya Anda sedang menulis hampir 20GB tabel sementara yang tidak secara kebetulan adalah jumlah tablespace yang Anda miliki untuk cluster database itu.

Ini menyarankan bahwa Anda memiliki kueri patologis yang membuat tabel sementara yang merupakan kelipatan dari isi basis data Anda. Anda harus mencoba mencatat semua pertanyaan yang masuk ke database Anda ( lihat aws docs untuk contoh) dan lihat apakah Anda dapat melihat di mana Anda secara tidak sengaja melakukan gabungan cartesian dari dua tabel dan memfilter output (atau bentuk apa pun yang mungkin dimiliki oleh kueri buruk Anda) diambil).

Anda mungkin ingin menetapkan temp_file_limitbatas ke nilai yang masuk akal (saya akan menggunakan 4GB) tetapi itu hanya akan membuat masalah mendasar lebih terlihat karena Anda akan mencapai batas sebelumnya.

Solusi nyata untuk ini adalah menemukan dan mengisolasi kueri yang menyebabkan Anda menggunakan semua ruang sementara itu. Cara termudah adalah mendapatkannya dalam sql dan mencari tahu mengapa ORM Django memproduksi itu.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.