Re: FW: REVIEW: Allow formatting in log_line_prefix
От | David Rowley |
---|---|
Тема | Re: FW: REVIEW: Allow formatting in log_line_prefix |
Дата | |
Msg-id | CAApHDvqJUgcHAdSPAFYy=tDW94bD2AbjwXudar4QuwBx5Za8mg@mail.gmail.com обсуждение исходный текст |
Ответ на | Re: FW: REVIEW: Allow formatting in log_line_prefix (Robert Haas <robertmhaas@gmail.com>) |
Ответы |
Re: FW: REVIEW: Allow formatting in log_line_prefix
(Robert Haas <robertmhaas@gmail.com>)
|
Список | pgsql-hackers |
On Sat, Sep 21, 2013 at 7:18 AM, Robert Haas <robertmhaas@gmail.com> wrote:
Do you specifically mean %*ld, or %* in general? As I can see various other places where %*s is used in the source by looking at grep -r "%\*" .
On Fri, Sep 20, 2013 at 3:15 AM, Albe Laurenz <laurenz.albe@wien.gv.at> wrote:/*
> David Rowley wrote:
>> I moved the source around and I've patched against it again. New patch attached.
>
> Thank you, marked as ready for committer.
+ * helper function for processing the format string in
+ * log_line_prefix()
+ * This function returns NULL if it finds something which
+ * it deems invalid for the log_line_prefix string.
+ */
Comments should be formatted as a single paragraph. If you want
multiple paragraphs, you need to include a line that's blank except
for the leading " *".
+static const char
+*process_log_prefix_padding(const char *p, int *ppadding)
The asterisk should be on the previous line, separated from "char" by a space.
I've attached another revision of the patch which cleans up the comment for the process_log_prefix_padding function to be more like the comments earlier in the same file. I have also moved the asterisk to the previous line.
+ appendStringInfo(buf, "%*ld", padding,
log_line_number);
Is %* supported by all versions of printf() on every platform we support?
But if you do mean specifically %*ld, then we did already use %ld here and since there are places which use %*s, would it be wrong to assume that %*ld is ok?
Earlier there was some discussion of performance. Was that tested?
I've done some performance tests now. I assume that the processing of the log line prefix would be drowned out by any testing of number of transactions per second, so I put a few lines at the start of send_message_to_server_log():
Which ended up looking like:
static void
send_message_to_server_log(ErrorData *edata)
{
StringInfoData buf;
int i;
float startTime, endTime;
startTime = (float)clock()/CLOCKS_PER_SEC;
StringInfoData tmpbuf;
for (i = 0; i < 1000000; i++)
{
initStringInfo(&tmpbuf);
log_line_prefix(&tmpbuf, edata);
pfree(tmpbuf.data);
}
endTime = (float)clock()/CLOCKS_PER_SEC;
printf("log_line_prefix (%s) in %f seconds\n", Log_line_prefix, endTime - startTime);
initStringInfo(&buf);
...
static void
send_message_to_server_log(ErrorData *edata)
{
StringInfoData buf;
int i;
float startTime, endTime;
startTime = (float)clock()/CLOCKS_PER_SEC;
StringInfoData tmpbuf;
for (i = 0; i < 1000000; i++)
{
initStringInfo(&tmpbuf);
log_line_prefix(&tmpbuf, edata);
pfree(tmpbuf.data);
}
endTime = (float)clock()/CLOCKS_PER_SEC;
printf("log_line_prefix (%s) in %f seconds\n", Log_line_prefix, endTime - startTime);
initStringInfo(&buf);
...
I am seeing a slow down in the processing of the 2 log_line_prefix strings that I tested with. Here are the results:
Patched (%a %u %d %p %t %m %i %e %c %l %s %v %x )
david@ubuntu64:~/9.4/bin$ ./postgres -D /home/david/9.4/data/
log_line_prefix (%a %u %d %p %t %m %i %e %c %l %s %v %x ) in 3.930000 seconds
62324 2013-09-20 05:37:30 NZST 2013-09-20 05:37:30.455 NZST 00000 523b3656.f374 1000001 2013-09-20 05:37:26 NZST 0 LOG: database system was shut down at 2013-09-20 05:36:21 NZST
log_line_prefix (%a %u %d %p %t %m %i %e %c %l %s %v %x ) in 3.940000 seconds
62329 2013-09-20 05:37:38 NZST 2013-09-20 05:37:38.724 NZST 00000 523b365a.f379 1000001 2013-09-20 05:37:30 NZST 0 LOG: autovacuum launcher started
log_line_prefix (%a %u %d %p %t %m %i %e %c %l %s %v %x ) in 3.960000 seconds
62323 2013-09-20 05:37:38 NZST 2013-09-20 05:37:38.756 NZST 00000 523b3656.f373 1000001 2013-09-20 05:37:26 NZST 0 LOG: database system is ready to accept connections
log_line_prefix (%a %u %d %p %t %m %i %e %c %l %s %v %x ) in 4.820000 seconds
psql david postgres 62331 2013-09-20 05:38:43 NZST 2013-09-20 05:38:43.490 NZST SELECT 22012 523b3688.f37b 1000001 2013-09-20 05:38:16 NZST 2/4 0 ERROR: division by zero
psql david postgres 62331 2013-09-20 05:38:43 NZST 2013-09-20 05:38:43.490 NZST SELECT 22012 523b3688.f37b 1000002 2013-09-20 05:38:16 NZST 2/4 0 STATEMENT: select 1/0;
log_line_prefix (%a %u %d %p %t %m %i %e %c %l %s %v %x ) in 4.690000 seconds
psql david postgres 62331 2013-09-20 05:39:35 NZST 2013-09-20 05:39:35.900 NZST SELECT 22012 523b3688.f37b 2000003 2013-09-20 05:38:16 NZST 2/5 0 ERROR: division by zero
psql david postgres 62331 2013-09-20 05:39:35 NZST 2013-09-20 05:39:35.900 NZST SELECT 22012 523b3688.f37b 2000004 2013-09-20 05:38:16 NZST 2/5 0 STATEMENT: select 1/0;
Unpatched (%a %u %d %p %t %m %i %e %c %l %s %v %x )
david@ubuntu64:~/9.4/bin$ ./postgres -D /home/david/9.4/data/
log_line_prefix (%a %u %d %p %t %m %i %e %c %l %s %v %x ) in 3.120000 seconds
925 2013-09-20 05:45:48 NZST 2013-09-20 05:45:48.483 NZST 00000 523b3849.39d 1000001 2013-09-20 05:45:45 NZST 0 LOG: database system was shut down at 2013-09-20 05:40:47 NZST
log_line_prefix (%a %u %d %p %t %m %i %e %c %l %s %v %x ) in 3.100000 seconds
924 2013-09-20 05:45:54 NZST 2013-09-20 05:45:54.970 NZST 00000 523b3849.39c 1000001 2013-09-20 05:45:45 NZST 0 LOG: database system is ready to accept connections
log_line_prefix (%a %u %d %p %t %m %i %e %c %l %s %v %x ) in 3.120000 seconds
931 2013-09-20 05:45:55 NZST 2013-09-20 05:45:55.015 NZST 00000 523b384c.3a3 1000001 2013-09-20 05:45:48 NZST 0 LOG: autovacuum launcher started
log_line_prefix (%a %u %d %p %t %m %i %e %c %l %s %v %x ) in 3.490000 seconds
psql david postgres 934 2013-09-20 05:46:31 NZST 2013-09-20 05:46:31.795 NZST SELECT 22012 523b3873.3a6 1000001 2013-09-20 05:46:27 NZST 2/2 0 ERROR: division by zero
psql david postgres 934 2013-09-20 05:46:31 NZST 2013-09-20 05:46:31.795 NZST SELECT 22012 523b3873.3a6 1000002 2013-09-20 05:46:27 NZST 2/2 0 STATEMENT: select 1/0;
log_line_prefix (%a %u %d %p %t %m %i %e %c %l %s %v %x ) in 3.560000 seconds
psql david postgres 934 2013-09-20 05:46:36 NZST 2013-09-20 05:46:36.473 NZST SELECT 22012 523b3873.3a6 2000003 2013-09-20 05:46:27 NZST 2/3 0 ERROR: division by zero
psql david postgres 934 2013-09-20 05:46:36 NZST 2013-09-20 05:46:36.473 NZST SELECT 22012 523b3873.3a6 2000004 2013-09-20 05:46:27 NZST 2/3 0 STATEMENT: select 1/0;
Patched (%a %u %d %p)
david@ubuntu64:~/9.4/bin$ ./postgres -D /home/david/9.4/data/
log_line_prefix (%a %u %d %p ) in 0.210000 seconds
1625 LOG: database system was shut down at 2013-09-20 05:48:50 NZST
log_line_prefix (%a %u %d %p ) in 0.210000 seconds
1624 LOG: database system is ready to accept connections
log_line_prefix (%a %u %d %p ) in 0.220000 seconds
1629 LOG: autovacuum launcher started
log_line_prefix (%a %u %d %p ) in 0.620000 seconds
psql david postgres 1631 ERROR: division by zero
psql david postgres 1631 STATEMENT: select 1/0;
log_line_prefix (%a %u %d %p ) in 0.660000 seconds
psql david postgres 1631 ERROR: division by zero
psql david postgres 1631 STATEMENT: select 1/0;
Unpatched (%a %u %d %p)
david@ubuntu64:~/9.4/bin$ ./postgres -D /home/david/9.4/data/
log_line_prefix (%a %u %d %p ) in 0.180000 seconds
2321 LOG: database system was shut down at 2013-09-20 05:50:35 NZST
log_line_prefix (%a %u %d %p ) in 0.180000 seconds
2320 LOG: database system is ready to accept connections
log_line_prefix (%a %u %d %p ) in 0.180000 seconds
2325 LOG: autovacuum launcher started
log_line_prefix (%a %u %d %p ) in 0.260000 seconds
psql david postgres 2327 ERROR: division by zero
psql david postgres 2327 STATEMENT: select 1/0;
log_line_prefix (%a %u %d %p ) in 0.270000 seconds
psql david postgres 2327 ERROR: division by zero
psql david postgres 2327 STATEMENT: select 1/0;
Patched (%a %u %d %p %t %m %i %e %c %l %s %v %x )
david@ubuntu64:~/9.4/bin$ ./postgres -D /home/david/9.4/data/
log_line_prefix (%a %u %d %p %t %m %i %e %c %l %s %v %x ) in 3.930000 seconds
62324 2013-09-20 05:37:30 NZST 2013-09-20 05:37:30.455 NZST 00000 523b3656.f374 1000001 2013-09-20 05:37:26 NZST 0 LOG: database system was shut down at 2013-09-20 05:36:21 NZST
log_line_prefix (%a %u %d %p %t %m %i %e %c %l %s %v %x ) in 3.940000 seconds
62329 2013-09-20 05:37:38 NZST 2013-09-20 05:37:38.724 NZST 00000 523b365a.f379 1000001 2013-09-20 05:37:30 NZST 0 LOG: autovacuum launcher started
log_line_prefix (%a %u %d %p %t %m %i %e %c %l %s %v %x ) in 3.960000 seconds
62323 2013-09-20 05:37:38 NZST 2013-09-20 05:37:38.756 NZST 00000 523b3656.f373 1000001 2013-09-20 05:37:26 NZST 0 LOG: database system is ready to accept connections
log_line_prefix (%a %u %d %p %t %m %i %e %c %l %s %v %x ) in 4.820000 seconds
psql david postgres 62331 2013-09-20 05:38:43 NZST 2013-09-20 05:38:43.490 NZST SELECT 22012 523b3688.f37b 1000001 2013-09-20 05:38:16 NZST 2/4 0 ERROR: division by zero
psql david postgres 62331 2013-09-20 05:38:43 NZST 2013-09-20 05:38:43.490 NZST SELECT 22012 523b3688.f37b 1000002 2013-09-20 05:38:16 NZST 2/4 0 STATEMENT: select 1/0;
log_line_prefix (%a %u %d %p %t %m %i %e %c %l %s %v %x ) in 4.690000 seconds
psql david postgres 62331 2013-09-20 05:39:35 NZST 2013-09-20 05:39:35.900 NZST SELECT 22012 523b3688.f37b 2000003 2013-09-20 05:38:16 NZST 2/5 0 ERROR: division by zero
psql david postgres 62331 2013-09-20 05:39:35 NZST 2013-09-20 05:39:35.900 NZST SELECT 22012 523b3688.f37b 2000004 2013-09-20 05:38:16 NZST 2/5 0 STATEMENT: select 1/0;
Unpatched (%a %u %d %p %t %m %i %e %c %l %s %v %x )
david@ubuntu64:~/9.4/bin$ ./postgres -D /home/david/9.4/data/
log_line_prefix (%a %u %d %p %t %m %i %e %c %l %s %v %x ) in 3.120000 seconds
925 2013-09-20 05:45:48 NZST 2013-09-20 05:45:48.483 NZST 00000 523b3849.39d 1000001 2013-09-20 05:45:45 NZST 0 LOG: database system was shut down at 2013-09-20 05:40:47 NZST
log_line_prefix (%a %u %d %p %t %m %i %e %c %l %s %v %x ) in 3.100000 seconds
924 2013-09-20 05:45:54 NZST 2013-09-20 05:45:54.970 NZST 00000 523b3849.39c 1000001 2013-09-20 05:45:45 NZST 0 LOG: database system is ready to accept connections
log_line_prefix (%a %u %d %p %t %m %i %e %c %l %s %v %x ) in 3.120000 seconds
931 2013-09-20 05:45:55 NZST 2013-09-20 05:45:55.015 NZST 00000 523b384c.3a3 1000001 2013-09-20 05:45:48 NZST 0 LOG: autovacuum launcher started
log_line_prefix (%a %u %d %p %t %m %i %e %c %l %s %v %x ) in 3.490000 seconds
psql david postgres 934 2013-09-20 05:46:31 NZST 2013-09-20 05:46:31.795 NZST SELECT 22012 523b3873.3a6 1000001 2013-09-20 05:46:27 NZST 2/2 0 ERROR: division by zero
psql david postgres 934 2013-09-20 05:46:31 NZST 2013-09-20 05:46:31.795 NZST SELECT 22012 523b3873.3a6 1000002 2013-09-20 05:46:27 NZST 2/2 0 STATEMENT: select 1/0;
log_line_prefix (%a %u %d %p %t %m %i %e %c %l %s %v %x ) in 3.560000 seconds
psql david postgres 934 2013-09-20 05:46:36 NZST 2013-09-20 05:46:36.473 NZST SELECT 22012 523b3873.3a6 2000003 2013-09-20 05:46:27 NZST 2/3 0 ERROR: division by zero
psql david postgres 934 2013-09-20 05:46:36 NZST 2013-09-20 05:46:36.473 NZST SELECT 22012 523b3873.3a6 2000004 2013-09-20 05:46:27 NZST 2/3 0 STATEMENT: select 1/0;
Patched (%a %u %d %p)
david@ubuntu64:~/9.4/bin$ ./postgres -D /home/david/9.4/data/
log_line_prefix (%a %u %d %p ) in 0.210000 seconds
1625 LOG: database system was shut down at 2013-09-20 05:48:50 NZST
log_line_prefix (%a %u %d %p ) in 0.210000 seconds
1624 LOG: database system is ready to accept connections
log_line_prefix (%a %u %d %p ) in 0.220000 seconds
1629 LOG: autovacuum launcher started
log_line_prefix (%a %u %d %p ) in 0.620000 seconds
psql david postgres 1631 ERROR: division by zero
psql david postgres 1631 STATEMENT: select 1/0;
log_line_prefix (%a %u %d %p ) in 0.660000 seconds
psql david postgres 1631 ERROR: division by zero
psql david postgres 1631 STATEMENT: select 1/0;
Unpatched (%a %u %d %p)
david@ubuntu64:~/9.4/bin$ ./postgres -D /home/david/9.4/data/
log_line_prefix (%a %u %d %p ) in 0.180000 seconds
2321 LOG: database system was shut down at 2013-09-20 05:50:35 NZST
log_line_prefix (%a %u %d %p ) in 0.180000 seconds
2320 LOG: database system is ready to accept connections
log_line_prefix (%a %u %d %p ) in 0.180000 seconds
2325 LOG: autovacuum launcher started
log_line_prefix (%a %u %d %p ) in 0.260000 seconds
psql david postgres 2327 ERROR: division by zero
psql david postgres 2327 STATEMENT: select 1/0;
log_line_prefix (%a %u %d %p ) in 0.270000 seconds
psql david postgres 2327 ERROR: division by zero
psql david postgres 2327 STATEMENT: select 1/0;
In the attached spreadsheet I've mocked up some very rough estimates on the performance cost of this change. I think a while ago I read about a benchmark Robert ran on a 64 core machine which ran around 400k transactions per second. I've included some workings in the spreadsheet to show how this change would affect that benchmark, but I have assumed that the hardware would only be able to execute the log_line_prefix function at the same speed as my i5 laptop. With this very worst case estimates my calculations say that the performance hit is 0.6% with the log_line_prefix which contains all of the variables and 0.11% for the shorter log_line_prefix. I would imagine that the hardware that performed 400k TPS would be able to run log_line_prefix faster than my 3 year old i5 laptop, so this is likely quite a big over estimation of the hit.
I did not run any benchmark tests using any padding as I have nothing to benchmark against.
David
--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company
Вложения
В списке pgsql-hackers по дате отправления: