Explorar o código

dns_conf: add option to adjust socket buffer size

Nick Peng hai 1 ano
pai
achega
c0bb9a5c97
Modificáronse 6 ficheiros con 41 adicións e 20 borrados
  1. 17 0
      src/dns_client.c
  2. 6 18
      src/dns_conf.c
  3. 1 0
      src/dns_conf.h
  4. 4 0
      src/dns_server.c
  5. 11 1
      src/tlog.c
  6. 2 1
      test/cases/test-perf.cc

+ 17 - 0
src/dns_client.c

@@ -1943,6 +1943,10 @@ static int _dns_client_create_socket_udp_proxy(struct dns_server_info *server_in
 
 	set_fd_nonblock(fd, 1);
 	set_sock_keepalive(fd, 30, 3, 5);
+	if (dns_socket_buff_size > 0) {
+		setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &dns_socket_buff_size, sizeof(dns_socket_buff_size));
+		setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &dns_socket_buff_size, sizeof(dns_socket_buff_size));
+	}
 
 	ret = proxy_conn_connect(proxy);
 	if (ret != 0) {
@@ -2044,6 +2048,11 @@ static int _dns_client_create_socket_udp(struct dns_server_info *server_info)
 		setsockopt(server_info->fd, IPPROTO_IPV6, IPV6_HOPLIMIT, &on, sizeof(on));
 	}
 
+	if (dns_socket_buff_size > 0) {
+		setsockopt(server_info->fd, SOL_SOCKET, SO_SNDBUF, &dns_socket_buff_size, sizeof(dns_socket_buff_size));
+		setsockopt(server_info->fd, SOL_SOCKET, SO_RCVBUF, &dns_socket_buff_size, sizeof(dns_socket_buff_size));
+	}
+
 	return 0;
 errout:
 	if (fd > 0) {
@@ -2184,6 +2193,10 @@ static int _DNS_client_create_socket_tcp(struct dns_server_info *server_info)
 	setsockopt(fd, IPPROTO_TCP, TCP_THIN_DUPACK, &yes, sizeof(yes));
 	setsockopt(fd, IPPROTO_TCP, TCP_THIN_LINEAR_TIMEOUTS, &yes, sizeof(yes));
 	set_sock_keepalive(fd, 30, 3, 5);
+	if (dns_socket_buff_size > 0) {
+		setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &dns_socket_buff_size, sizeof(dns_socket_buff_size));
+		setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &dns_socket_buff_size, sizeof(dns_socket_buff_size));
+	}
 
 	if (proxy) {
 		ret = proxy_conn_connect(proxy);
@@ -2304,6 +2317,10 @@ static int _DNS_client_create_socket_tls(struct dns_server_info *server_info, ch
 	set_sock_keepalive(fd, 30, 3, 5);
 	setsockopt(fd, SOL_SOCKET, SO_PRIORITY, &priority, sizeof(priority));
 	setsockopt(fd, IPPROTO_IP, IP_TOS, &ip_tos, sizeof(ip_tos));
+	if (dns_socket_buff_size > 0) {
+		setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &dns_socket_buff_size, sizeof(dns_socket_buff_size));
+		setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &dns_socket_buff_size, sizeof(dns_socket_buff_size));
+	}
 
 	if (proxy) {
 		ret = proxy_conn_connect(proxy);

+ 6 - 18
src/dns_conf.c

@@ -162,6 +162,7 @@ char dns_save_fail_packet_dir[DNS_MAX_PATH];
 char dns_resolv_file[DNS_MAX_PATH];
 int dns_no_pidfile;
 int dns_no_daemon;
+size_t dns_socket_buff_size;
 
 struct hash_table conf_file_table;
 struct conf_file_path {
@@ -1824,14 +1825,6 @@ errout:
 	return 0;
 }
 
-static int _config_ipset_timeout(void *data, int argc, char *argv[])
-{
-	struct config_item_yesno item;
-
-	item.data = &_config_current_rule_group()->ipset_nftset.ipset_timeout_enable;
-	return conf_yesno(NULL, &item, argc, argv);
-}
-
 static int _config_ipset(void *data, int argc, char *argv[])
 {
 	char domain[DNS_MAX_CONF_CNAME_LEN];
@@ -1875,14 +1868,6 @@ errout:
 	return 0;
 }
 
-static int _config_nftset_timeout(void *data, int argc, char *argv[])
-{
-	struct config_item_yesno item;
-
-	item.data = &_config_current_rule_group()->ipset_nftset.nftset_timeout_enable;
-	return conf_yesno(NULL, &item, argc, argv);
-}
-
 static void _config_nftset_table_destroy(void)
 {
 	struct dns_nftset_name *nftset = NULL;
@@ -5682,10 +5667,12 @@ static struct config_item _config_item[] = {
 	CONF_CUSTOM("cname", _config_cname, NULL),
 	CONF_CUSTOM("srv-record", _config_srv_record, NULL),
 	CONF_CUSTOM("proxy-server", _config_proxy_server, NULL),
-	CONF_CUSTOM("ipset-timeout", _config_ipset_timeout, NULL),
+	CONF_YESNO_FUNC("ipset-timeout", _dns_conf_group_yesno,
+					(void *)offsetof(struct dns_conf_group, ipset_nftset.ipset_timeout_enable)),
 	CONF_CUSTOM("ipset", _config_ipset, NULL),
 	CONF_CUSTOM("ipset-no-speed", _config_ipset_no_speed, NULL),
-	CONF_CUSTOM("nftset-timeout", _config_nftset_timeout, NULL),
+	CONF_YESNO_FUNC("nftset-timeout", _dns_conf_group_yesno,
+					(void *)offsetof(struct dns_conf_group, ipset_nftset.nftset_timeout_enable)),
 	CONF_YESNO("nftset-debug", &dns_conf_nftset_debug_enable),
 	CONF_CUSTOM("nftset", _config_nftset, NULL),
 	CONF_CUSTOM("nftset-no-speed", _config_nftset_no_speed, NULL),
@@ -5767,6 +5754,7 @@ static struct config_item _config_item[] = {
 	CONF_YESNO("debug-save-fail-packet", &dns_save_fail_packet),
 	CONF_YESNO("no-pidfile", &dns_no_pidfile),
 	CONF_YESNO("no-daemon", &dns_no_daemon),
+	CONF_SIZE("socket-buff-size", &dns_socket_buff_size, 0, 1024 * 1024 * 8),
 	CONF_CUSTOM("plugin", _config_plugin, NULL),
 	CONF_STRING("resolv-file", (char *)&dns_resolv_file, sizeof(dns_resolv_file)),
 	CONF_STRING("debug-save-fail-packet-dir", (char *)&dns_save_fail_packet_dir, sizeof(dns_save_fail_packet_dir)),

+ 1 - 0
src/dns_conf.h

@@ -696,6 +696,7 @@ extern char dns_resolv_file[DNS_MAX_PATH];
 
 extern int dns_no_pidfile;
 extern int dns_no_daemon;
+extern size_t dns_socket_buff_size;
 
 void dns_server_load_exit(void);
 

+ 4 - 0
src/dns_server.c

@@ -8171,6 +8171,10 @@ static int _dns_create_socket(const char *host_ip, int type)
 	}
 	setsockopt(fd, SOL_SOCKET, SO_PRIORITY, &priority, sizeof(priority));
 	setsockopt(fd, IPPROTO_IP, IP_TOS, &ip_tos, sizeof(ip_tos));
+	if (dns_socket_buff_size > 0) {
+		setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &dns_socket_buff_size, sizeof(dns_socket_buff_size));
+		setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &dns_socket_buff_size, sizeof(dns_socket_buff_size));
+	}
 
 	if (ifname != NULL) {
 		struct ifreq ifr;

+ 11 - 1
src/tlog.c

@@ -1566,7 +1566,16 @@ static void _tlog_work_write(struct tlog_log *log, int log_len, int log_extlen,
     if (log_dropped > 0) {
         /* if there is dropped log, record dropped log number */
         char dropmsg[TLOG_TMP_LEN];
-        snprintf(dropmsg, sizeof(dropmsg), "[Total Dropped %d Messages]\n", log_dropped);
+        char *msg = dropmsg;
+        struct tlog_segment_log_head *log_head = NULL;
+        if (log->segment_log) {
+            memset(dropmsg, 0, sizeof(struct tlog_segment_log_head));
+            log_head = (struct tlog_segment_log_head *)dropmsg;
+            msg += sizeof(struct tlog_segment_log_head);
+            log_head->info.level = TLOG_WARN;
+        }
+        int len = snprintf(msg, msg - dropmsg, "[Total Dropped %d Messages]\n", log_dropped);
+        log_head->len = len;
         _tlog_write_output_func(log, dropmsg, strnlen(dropmsg, sizeof(dropmsg)));
     }
 }
@@ -1601,6 +1610,7 @@ static int _tlog_root_write_log(struct tlog_log *log, const char *buff, int buff
     }
 
     _tlog_root_write_screen_log(log, NULL, buff, bufflen);
+    memset(&empty_info, 0, sizeof(empty_info));
     return tlog.output_func(&empty_info.info, buff, bufflen, tlog_get_private(log));
 }
 

+ 2 - 1
test/cases/test-perf.cc

@@ -63,9 +63,10 @@ TEST_F(Perf, no_speed_check)
 server 127.0.0.1:61053
 speed-check-mode none
 log-level error
+socket-buff-size 1M
 )""");
 	std::string file = "/tmp/smartdns-perftest-domain.list" + smartdns::GenerateRandomString(5);
-	std::string cmd = "dnsperf -p 60053";
+	std::string cmd = "dnsperf -p 60053 -b 1024";
 	cmd += " -d ";
 	cmd += file;
 	std::ofstream ofs(file);