bin/61664: syslogd speedup

Divacky Roman xdivac02 at stud.fit.vutbr.cz
Wed Jan 21 01:20:09 PST 2004


>Number:         61664
>Category:       bin
>Synopsis:       syslogd speedup
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          update
>Submitter-Id:   current-users
>Arrival-Date:   Wed Jan 21 01:20:06 PST 2004
>Closed-Date:
>Last-Modified:
>Originator:     Divacky Roman
>Release:        FreeBSD 4.9-STABLE i386
>Organization:
>Environment:
System: FreeBSD eva.fit.vutbr.cz 4.9-STABLE FreeBSD 4.9-STABLE #2: Thu Nov 20 11:20:53 CET 2003 root at tereza.fit.vutbr.cz:/home/src/sys/sys-49/compile/EVA i386


	
>Description:
	When syslogd logs kernel messages it does it quite weird way. It reads
	buffer from /dev/kmsg and then writes it into log file fsync()ing after
	EACH newline.. this is very slow and much less secure than fsync()ing
	it after whole buffer... this patch implements such behviour
>How-To-Repeat:
	apply this patch ;)
>Fix:
--- syslogd.8	Mon Sep  8 21:57:22 2003
+++ /home/roman/kernel/patches/syslogd/syslogd.8	Wed Jan 14 17:21:14 2004
@@ -224,6 +224,9 @@
 logged with each locally-written message.  If specified more than once,
 the names of the facility and priority are logged with each locally-written
 message.
+.It Fl x
+Turns on old behaviour of fsync()ing after each line. This might make syslogd
+slower!
 .El
 .Pp
 The
--- syslogd.c	Sun Nov 16 22:51:06 2003
+++ /home/roman/kernel/patches/syslogd/syslogd.c	Wed Jan 14 17:27:14 2004
@@ -288,6 +288,7 @@
 static int	LogFacPri;	/* Put facility and priority in log message: */
 				/* 0=no, 1=numeric, 2=names */
 static int	KeepKernFac;	/* Keep remotely logged kernel facility */
+static int	DoFsync;	/* wheter do a fsync() on boot */
 
 volatile sig_atomic_t MarkSet, WantDie;
 
@@ -310,7 +311,7 @@
 static void	markit(void);
 static int	skip_message(const char *, const char *, int);
 static void	printline(const char *, char *);
-static void	printsys(char *);
+static void	printsys(char *, int);
 static int	p_open(const char *, pid_t *);
 static void	readklog(void);
 static void	reapchild(int);
@@ -338,7 +339,7 @@
 	socklen_t len;
 
 	bindhostname = NULL;
-	while ((ch = getopt(argc, argv, "46Aa:b:cdf:kl:m:nop:P:suv")) != -1)
+	while ((ch = getopt(argc, argv, "46Aa:b:cdf:kl:m:nop:P:suvx")) != -1)
 		switch (ch) {
 		case '4':
 			family = PF_INET;
@@ -401,6 +402,9 @@
 		case 'v':		/* log facility and priority */
 		  	LogFacPri++;
 			break;
+		case 'x':
+		        DoFsync++;	/* Do fsync() */	
+			break;
 		case '?':
 		default:
 			usage();
@@ -716,29 +720,34 @@
 
 		for (p = line; (q = strchr(p, '\n')) != NULL; p = q + 1) {
 			*q = '\0';
-			printsys(p);
+			printsys(p, ISKERNEL | ADDDATE);
 		}
 		len = strlen(p);
 		if (len >= MAXLINE - 1) {
-			printsys(p);
+			printsys(p, ISKERNEL | ADDDATE);
 			len = 0;
 		}
+		/* XXX: This could be as well on the end of this function */
+		if (!DoFsync)
+		   fsync (Files->f_file);
 		if (len > 0) 
 			memmove(line, p, len + 1);
 	}
 	if (len > 0)
-		printsys(line);
+		printsys(line, ISKERNEL | ADDDATE | SYNC_FILE);
 }
 
 /*
  * Take a raw input line from /dev/klog, format similar to syslog().
  */
 static void
-printsys(char *p)
+printsys(char *p, int flags)
 {
-	int pri, flags;
+	int pri;
 
-	flags = ISKERNEL | SYNC_FILE | ADDDATE;	/* fsync after write */
+	if (DoFsync) 
+	   flags |= SYNC_FILE;	/* fsync after write */
+	   
 	pri = DEFSPRI;
 	if (*p == '<') {
 		pri = 0;


>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list