Remote Postgresql - extremely slow

12,279

Solution 1

I enabled logging and sent the logs to the developers of their software. Their answer was that there software was originally intended to run on a local or near local database so running on a VPS would be expectedly slow - due to network latency.

Thanks for all your help, but it looks like I'm out of ideas and it's due to the software, rather than PostgreSQL on the VPS specifically.

Thanks, Ricky

Solution 2

You can do an explain analyze which will tell you the execution time of the query on the server (without the network overhead of sending the result to the client).

If the server execution time is very quick (compared to the time you are seeing) than this is a network problem. If the reported time is very similar to what you observe on your side, it's a PostgreSQL problem (and then you need to post the execution plan and possibly your PostgreSQL configuration)

Solution 3

Have been plagued by this issue for awhile and this question lead me to the answer so thought I would share incase it helps.

The server had a secondary network interface (eth1) that was setup as the default route. The client performing the queries was within the same subnet as eth0, so this should not cause any issues.. but it was.

Disabling the default route made the queries return back within normal time frames. But the long term fix was to change the listen_addresses from '*' to the correct IP.

Share:
12,279
Ricky
Author by

Ricky

Software developer working full time. Side projects include self employed work in my spare time and developing my Android app Darts Master 2 (I'm a darts fan!). I mainly code in Java and C# and have experience with many other languages too. I also have several years working in I.T support.

Updated on July 20, 2022

Comments

  • Ricky
    Ricky almost 2 years

    I have setup PostgreSQL on a VPS I own - the software that accesses the database is a program called PokerTracker.

    PokerTracker logs all your hands and statistics whilst playing online poker.

    I wanted this accessible from several different computers so decided to installed it on my VPS and after a few hiccups I managed to get it connecting without errors.

    However, the performance is dreadful. I have done tons of research on 'remote postgresql slow' etc and am yet to find an answer so am hoping someone is able to help.

    Things to note:

    The query I am trying to execute is very small. Whilst connecting locally on the VPS, the query runs instantly.

    While running it remotely, it takes about 1 minute and 30 seconds to run the query.

    The VPS is running 100MBPS and then computer I'm connecting to it from is on an 8MB line.

    The network communication between the two is almost instant, I am able to remotely connect fine with no lag whatsoever and am hosting several websites running MSSQL and all the queries run instantly, whether connected remotely or locally so it seems specific to PostgreSQL.

    I'm running their newest version of the software and the newest compatible version of PostgreSQL with their software.

    The database is a new database, containing hardly any data and I've ran vacuum/analyze etc all to no avail, I see no improvements.

    I don't understand how MSSQL can query almost instantly yet PostgreSQL struggles so much.

    I am able to telnet to the port 5432 on the VPS IP with no problems, and as I say the query does execute it just takes an extremely long time.

    What I do notice is on the router when the query is running that hardly any bandwidth is being used - but then again I wouldn't expect it to for a simple query but am not sure if this is the issue. I've tried connecting remotely on 3 different networks now (including different routers) but the problem remains.

    Connecting remotely via another machine via the LAN is instant.

    I have also edited the postgre conf file to allow for more memory/buffers etc but I don't think this is the problem - what I am asking it to do is very simple - it shouldn't be intensive at all.

    Thanks, Ricky

    Edit: Please note the client and server are both running Windows.

    Here is information from the config files.

    pg_hba - currently allowing all traffic:
    
    # TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
    
    # IPv4 local connections:
    host     all     all     0.0.0.0/0   md5
    # IPv6 local connections:
    # host   all     all     ::1/128     md5
    

    And postgresqlconf - I'm aware I've given some mammoth amount of buffers/memory to this config, just to test if it was the issue - showing uncommented lines only:

    listen_addresses = '*'
    port = 5432
    max_connections = 100
    shared_buffers = 512MB
    work_mem = 64MB
    max_fsm_pages = 204800
    shared_preload_libraries = '$libdir/plugins/plugin_debugger.dll'
    log_destination = 'stderr'
    logging_collector = on
    log_line_prefix = '%t '
    datestyle = 'iso, mdy'
    lc_messages = 'English_United States.1252'
    lc_monetary = 'English_United States.1252'
    lc_numeric = 'English_United States.1252'
    lc_time = 'English_United States.1252'
    default_text_search_config = 'pg_catalog.english'
    

    Any other information required, please let me know. Thanks for all your help.

  • Ricky
    Ricky over 13 years
    I will try Wireshark tonight. Thanks for your input.
  • Ricky
    Ricky over 13 years
    Hi. I tried select version() remotely and it was pretty much instant (maybe a few milliseconds) and displayed the version. On my VPS, there is no anti virus software.
  • Ricky
    Ricky over 13 years
    Hi, I tried running the select version() query remotely and locally and both times it was pretty much instant. Locally, the program 'PokerTracker' imports data instantly. Remotely, it takes much, much longer. I'm going to post my configs.
  • a_horse_with_no_name
    a_horse_with_no_name over 13 years
    select version() doesn't transfer any realistic amount of data between the server and the client. You should really run explain analyze on one of the slow queries to find the real culprit
  • Ricky
    Ricky over 13 years
    The problem I have is it's a third party program running the query, so I'm not sure what the query actually is. Is there some other generic query I could run against it, something that requires more data transferred between the two?
  • a_horse_with_no_name
    a_horse_with_no_name over 13 years
    Pick some large table (> 1000 rows) and do a SELECT * FROM the_table
  • Ricky
    Ricky over 13 years
    I wonder if this is the issue. The OS the VPS is installed on may be causing the issue. If something is timing out, I may not have control over it as I only have access to the VPS. Would this be logged anywhere, if it is timing out? Does PostgreSQL create error logs etc?
  • Ricky
    Ricky over 13 years
    I ran explain analyze and selected everything from the pg_attribute table (as that had over 1000 rows) and the query took about 1 second, with the following results: QUERY PLAN ------------------------------------------------------------‌​-------------------- ------------------------------- Seq Scan on pg_attribute (cost=0.00..47.74 rows=1774 width=103) (actual time=0 .017..2.784 rows=1774 loops=1) Total runtime: 5.235 ms (2 rows)
  • a_horse_with_no_name
    a_horse_with_no_name over 13 years
    So that query runs in 1 second and takes 5ms on the server. Doesn't really sound like a network problem. Which SQL tool did you use to run that? You could turn on logging of slow statements (using the config parameter log_min_duration_statement) on the server to find out which statements that your application generates actually take that long.
  • Ricky
    Ricky over 13 years
    I'm using psql - once logged in I run \i [sqlfile.sql] which contains the query, and the above outputs to the terminal. I ran a further test, selecting * from a different table with nearly 25,000 rows and that took about 10 seconds. Thanks for your help so far. Should I be using a different tool? As I mentioned, I'm not familiar with PostgreSQL so I'm finding all this out as I go along!
  • a_horse_with_no_name
    a_horse_with_no_name over 13 years
    No, psql is fine. My next step would be to turn on the slow statement logging on the server. That way you can pinpoint the application's query to find out what's wrong
  • Ricky
    Ricky over 13 years
    I have enabled logging and will run some queries using the program later today. Thanks for your help - and I'll update hopefully tomorrow with some results.
  • Ricky
    Ricky over 13 years
    Hi Johny, please note this is not connecting through a VPN - it's held on a VPS.