cara menghilangkan long select pada startup server postgresql 9.4


0

Saya memiliki postgis-2.1 postgresql-9.4 db yang besar (~ 6 GB) yang mengandung kontur elevasi pada netbook yang menjalankan debian jessie. Setiap kali saya memulai sistem saya mendapatkan proses yang terlihat seperti ini:

00:00:01 postgres: kontur nama pengguna :: 1 (33525) PILIH

Proses ini akan berjalan sekitar 30-40 menit di netbook saya yang saya gunakan untuk navigasi di truk saya, kemudian akan menunjukkan proses sebagai idle. Selama ini, netbook tidak berguna. Proses ini terlalu banyak memakan memori dan disk I / O benar-benar pembunuhnya.

Pertanyaan saya adalah, bagaimana saya bisa menghentikan pemilihan ini mulai? Saya sudah melakukan yang terbaik untuk mengisolasi masalah ke server postgresql. Tidak ada aplikasi lain yang memulai permintaan ini.

Proses postgres yang berjalan pada saat ini terjadi adalah:

  • proses checkpointer
  • proses penulis
  • wal proses penulis
  • proses peluncur autovacuum
  • proses pengumpul statistik

Pembaruan: Oke, dengan bantuan filiprem, saya dapat melacak pernyataan pilih yang menyebabkan masalah ini:

SELECT ST_XMin(ext),ST_YMin(ext),ST_XMax(ext),ST_YMax(ext) FROM (SELECT ST_Extent(way) as ext from planet_osm_line) as tmp

Masalahnya adalah saya masih tidak tahu dari mana pernyataan ini (khusus) dihasilkan. Perintah yang menyebabkannya adalah:

liteserv.py -p 8034 -c --config=topo.cfg topo.xml

topo.cfg tidak memiliki hubungan di dalamnya. Saya melakukan grep pada topo.xml mencari pernyataan pilih, dan menemukan (3):

(select way,contour_ext,ele from &prefix;_line where contour_ext='elevation_minor') as contour_minor
(select way,contour_ext,ele from &prefix;_line where contour_ext='elevation_medium') as contour_medium
(select way,contour_ext,ele from &prefix;_line where contour_ext='elevation_major') as contour_major

Inilah isi dari liteserv.py:

#!/usr/bin/env python

import os
import sys
import socket
from optparse import OptionParser
from wsgiref.simple_server import make_server, WSGIServer, WSGIRequestHandler
import logging

CONFIG = 'tilelite.cfg'
MAP_FROM_ENV = 'MAPNIK_MAP_FILE'

parser = OptionParser(usage="""
        python liteserv.py <mapfile.xml> [options]
        """)

parser.add_option('-i', '--ip', default='0.0.0.0', dest='host',
        help='Specify a ip to listen on (defaults to 0.0.0.0/localhost)'
        )

parser.add_option('-p', '--port', default=8000, dest='port', type='int',
        help='Specify a custom port to run on: eg. 8080'
        )

parser.add_option('--config', default=None, dest='config',
        help='''Specify the use of a custom TileLite config file to override default settings. By default looks for a file locally called 'tilelite.cfg'.'''
        )

parser.add_option('-s', '--size', default=None, dest='size', type='int',
        help='Specify a custom tile size (defaults to 256)'
        )

parser.add_option('-b', '--buffer-size', default=None, dest='buffer_size', type='int',
        help='Specify a custom map buffer_size (defaults to 128)'
        )

parser.add_option('-z', '--max-zoom', default=None, dest='max_zoom', type='int',
        help='Max zoom level to support (defaults to 22)'
        )

parser.add_option('-f', '--format', default=None, dest='format',
        help='Specify a custom image format (png or jpeg) (defaults to png)'
        )

parser.add_option('--paletted', default=False, dest='paletted', action='store_true',
        help='Use paletted/8bit PNG (defaults to False)'
        )

parser.add_option('-d','--debug', default=True, dest='debug', type="choice", choices=('True','False'),
        help='Run in debug mode (defaults to True)'
        )

parser.add_option('-c','--caching', default=False, dest='caching', action='store_true',
        help='Turn on tile caching mode (defaults to False)'
        )

parser.add_option('--cache-path', default=None, dest='cache_path',
        help='Path to tile cache directory (defaults to "/tmp")'
        )

parser.add_option('--cache-force', default=False, dest='cache_force', action='store_true',
        help='Force regeneration of tiles while in caching mode (defaults to False)'
        )

parser.add_option('--processes', default=1, dest='num_processes', type='int',
        help='If werkzeug is installed, number of rendering processes to allow'
        )

def run(process):
        try:
                process.serve_forever()
        except KeyboardInterrupt:
                process.server_close()
                sys.exit(0)

def strip_opts(options):
        remove = [None,'config','port','host']
        params = {}
        for k,v in options.items():
                if not k in remove and not v is None:
                        params[k] = v
        return params

def print_url(options):
        if not application.debug:
                logging.warning('TileLite debug mode is *off*...')
        logging.warning("Listening on %s:%s...\n" % (options.host,options.port))
        logging.warning("To access locally view: http://localhost:%s\n" % options.port)
        remote = "To access remotely view: http://%s" % socket.getfqdn()
        if not options.port == 80:
                remote += ":%s" % options.port
        remote += "\nor view: http://%s" % socket.gethostbyname(socket.gethostname())
        if not options.port == 80:
                remote += ":%s" % options.port
        logging.warning('%s\n' % remote)

if __name__ == '__main__':
        (options, args) = parser.parse_args()
        logging.basicConfig(filename='/tmp/liteserv%s.log' % options.port, format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %H:%M:%S')

        if len(args) < 1:
                try:
                        mapfile = os.environ[MAP_FROM_ENV]
                except:
                        sys.exit("\nPlease provide either the path to a mapnik xml or\nset an environment setting called '%s'\n" % (MAP_FROM_ENV))
        else:
                mapfile = args[0]
                if not os.path.exists(mapfile):
                        sys.exit('Could not locate mapfile.')

        logging.warning("[TileLite Debug] --> Using mapfile: '%s'" % os.path.abspath(mapfile))
        logging.warning("options.config: %s" % options.config)
        if options.config:
                if not os.path.isfile(options.config):
                        sys.exit('That does not appear to be a valid config file')
                else:
                        CONFIG = options.config

        if not os.path.exists(CONFIG):
                if options.config:
                        sys.exit('Could not locate custom config file')
                else:
                        CONFIG = None

        if CONFIG:
                logging.warning("[TileLite Debug] --> Using config file: '%s'" % os.path.abspath(CONFIG))      

        if options.cache_path and not options.caching:
                options.caching = True

        if options.cache_force and not options.caching:
                options.caching = True

        #parser.error("Caching must be turned on with '--caching' flag for liteserv.py to accept '--cache-path' option")
        #http_setup = options.host, options.port
        #httpd = simple_server.WSGIServer(http_setup, WSGIRequestHandler)
        #httpd.set_app(application)

        from tilelite import Server
        application = Server(mapfile, CONFIG)
        application.absorb_options(strip_opts(options.__dict__))

        try:
                from werkzeug import run_simple
                print_url(options)
                run_simple(options.host, options.port, application, threaded=False, processes=options.num_processes)
        except:
                if options.num_processes > 1:
                        sys.exit('The werkzeug python server must be installed to run multi-process\n')
                logging.warning('Note: werkzeug is not installed so falling back to built-in python wsgiref server.\n')
                logging.warning('Install werkzeug from http://werkzeug.pocoo.org/\n\n')

                from wsgiref import simple_server
                # below code was for testing multi-threaded rendering
                # which only works if we copy a map object per thread
                # so avoid this and only run multiprocess...
                #from SocketServer import ThreadingMixIn
                #class myServer(ThreadingMixIn, simple_server.WSGIServer):
                #    pass 
                #httpd = myServer(('',options.port), simple_server.WSGIRequestHandler,)
                #httpd.set_app(application)
                httpd = make_server(options.host, options.port, application)        
                print_url(options)
                run(httpd)

Saya tidak melihat apa pun di sana yang jelas akan menyebabkan pernyataan pilih di atas dikeluarkan. Apakah ada orang lain?

Jawaban:


0

Server PostgreSQL tidak memulai pernyataan SELECT yang telah berjalan lama dengan sendirinya.

Itu harus koneksi klien yang menjalankan kueri ini saat startup.

Anda dapat melakukan beberapa hal:

1) Aktifkan pencatatan dan lihat dari mana kueri itu berasal. Edit postgresql.confdan tambahkan ini:

logging_collector = on
log_line_prefix = '%t %p %r %d %u '
log_connections = on
log_statement = all

2) Ketika Anda melihat kueri yang sebenarnya, Anda dapat menjalankannya EXPLAINuntuk melihat mengapa itu membutuhkan waktu yang lama. Mungkin itu bisa dioptimalkan?

3) Periksa preferensi aplikasi Anda untuk pengaturan startup. Mungkin fitur penyegaran bisa dinonaktifkan?


filiprem, terima kasih atas saran Anda. Mereka membantu saya sedikit lebih jauh dalam proses penyelesaian masalah. Saya telah memperbarui pertanyaan, dengan informasi tentang pernyataan yang menyebabkan masalah, tetapi saya masih kesulitan menemukan dari mana pernyataan ini dikeluarkan.
nomadicME
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.