Hi,
When having bad performance, I usually first try to find out if the slowness is
due to disk througput (sequential), slow random access or something else. In
Linux, try "iostat -xtc 5". Do this with and without your application writing
to disk.
If you see high CPU %iowait and high %util on your disk, then disk is the
bottleneck. If not: start profiling / analyzing other bottlenecks (CPU /
network / ...)
If the disk throughput (wMB/s) is close to your normal sequential throughput
(69 MB/s): try to write less data or get a faster disk.
If the disk troughput is low, but high numbers of writes (w/s): there's too
much seeking / too many small writes to your disk. Page cache too small ?
Checkpointing too often ?
Sometimes this kind of problems is caused by other applications (logging / ...)
causing too much baseload. %util should be low when your application isn't
running.
Just my 2 cents.
Kind regards,
Droedel
On Sun, Jul 29, 2018, at 10:14, Rob Willett wrote:
> Hi,
>
> Background
>
> We've been refactoring our database to reduce the size of it. Through
> some simple logic we've managed to pull out 99% of the data to reduce
> the size from 51GB down to approx 600MB. This logic has been to remove
> rows that are almost the same but not quite identical. As with all
> things, the thinking was the difficult bit, the execution somewhat
> easier.
>
> As part of the testing we've been doing, we've now hit on an odd and
> weird problem to do with the COMMIT statement. A commit of a few hundred
> (circa 600-800) rows takes approx 7 seconds whereas before we never even
> noticed it, though we now know it was two seconds before. Each row is
> probably 1-2K of data, so its not very much at all.
>
> Details of what we have tried:
>
> 1. We've turned synchronous on and off
>
> PRAGMA synchronous=ON
>
> and thats not made any difference.
>
> 2. We are using and have been using WAL mode for years.
>
> PRAGMA journal_mode;
> journal_mode
> wal
>
> 3. We've tested that the server copies OK, we get a consistent 69MB/sec.
> This is not as fast we would like, but it's the same across all our
> virtual servers.
>
> 4. We've tested the commit on our existing 60GB database and it takes 2
> seconds, which is longer than we thought it would be. The server for the
> 60GB database is a large VPS with 8GB/8 cores and runs Ubuntu 14.04. The
> server we are testing on is a 2GB/2 core test server running Ubuntu
> 16.04. Whilst the test server is smaller, we wouldn't expect it to take
> 3 times longer to do a commit.
>
> 5. The code is identical across the servers. We are running Perl and the
> DBI module. The code for doing a commit in Perl::DBI is
> $dbh->do("COMMIT");
>
> We are getting the expected performance elsewhere on the system and
> in the code. It's just the commit that is taking a long time.
>
> 6. The code we are committing is adding 600-800 lines to a table that
> used to be 200,000,000 rows in size. It's now 400,000 lines in size. We
> are wondering if the deletion of the lines has had an impact we didn't
> expect. We have vacuumed and analysed the database.
>
> The schema for the table we insert into is
>
> CREATE TABLE IF NOT EXISTS "Disruptions" (
> "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
> "version" integer NOT NULL,
> "Disruption_id" INTEGER NOT NULL,
> "status" integer NOT NULL,
> "severity" integer NOT NULL,
> "levelOfInterest" integer NOT NULL,
> "category" integer NOT NULL,
> "subCategory" integer NOT NULL,
> "startTime" TEXT NOT NULL,
> "endTime" text NOT NULL,
> "location" integer NOT NULL,
> "corridor" integer NOT NULL,
> "comments" integer NOT NULL,
> "currentUpdate" integer NOT NULL,
> "remarkTime" TEXT NOT NULL,
> "lastModTime" TEXT NOT NULL,
> "CauseAreaPointX" real NOT NULL,
> "CauseAreaPointY" real NOT NULL,
> "Direction" TEXT
> );
> CREATE INDEX "Disruptions_Idx1" ON Disruptions ("location" COLLATE
> NOCASE ASC, "corridor" COLLATE NOCASE ASC, "status" COLLATE NOCASE ASC,
> "category" COLLATE NOCASE ASC, "severity" COLLATE NOCASE ASC,
> "levelOfInterest" COLLATE NOCASE ASC, "version" COLLATE NOCASE ASC,
> "subCategory" COLLATE NOCASE ASC, "startTime" COLLATE NOCASE ASC);
> CREATE UNIQUE INDEX "Disruptions_Idx2" ON Disruptions ("Disruption_id"
> COLLATE NOCASE ASC, "version" COLLATE NOCASE ASC, "category" COLLATE
> NOCASE ASC, "subCategory" COLLATE NOCASE ASC);
> CREATE UNIQUE INDEX "Disruptions_Idx3" ON Disruptions ("version" COLLATE
> NOCASE ASC, "Disruption_id" COLLATE NOCASE ASC, "location" COLLATE
> NOCASE ASC);
> CREATE INDEX Disruptions_Idx5 ON Disruptions ("status", "Disruption_id",
> "Severity", "levelOfInterest", "category", "subCategory", "version");
>
> We have checked that this schema is consistent across the databases.
>
> We're about to recreate the table to see if that makes a difference.
>
> Any help or advice welcomed.
>
> Thanks
>
> Rob
> _______________________________________________
> sqlite-users mailing list
> [email protected]
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
_______________________________________________
sqlite-users mailing list
[email protected]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users