Skip to content

Commit 086cc88

Browse files
authored
Add option to detect available cores when num_threads=-1 (#380)
When configuring `num_threads=-1` in `renderd.conf` for a `renderd` section, the value will be set to the number of cores on the running system.
1 parent 6e2fc56 commit 086cc88

4 files changed

Lines changed: 39 additions & 7 deletions

File tree

docs/man/renderd.conf.5

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
.TH RENDERD.CONF 5 "2023-12-19" "mod_tile v0.7.0"
1+
.TH RENDERD.CONF 5 "2024-01-22" "mod_tile v0.7.0"
22
.\" Please adjust this date whenever revising the manpage.
33

44
.SH NAME
@@ -41,6 +41,7 @@ This option and \fBsocketname\fR are mutually exclusive.
4141
.TP
4242
.B num_threads
4343
Specify the number of threads to be used for \fBrenderd\fR.
44+
A value of \fB'-1'\fR will configure \fBnum_threads\fR to the number of cores on the system.
4445
The default value is \fB'4'\fR (macro definition \fB'NUM_THREADS'\fR).
4546

4647
.TP
@@ -205,4 +206,4 @@ Only used by \fBrenderd\fR.
205206
.SH AUTHOR
206207
renderd was written by Jon Burgess, and other OpenStreetMap project members.
207208
.PP
208-
This manual page was written by OpenStreetMap authors.
209+
This manual page was written by OpenStreetMap authors.

src/renderd.c

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ static int exit_pipe_fd;
6666

6767
static renderd_config config;
6868

69-
int noSlaveRenders;
69+
int num_slave_threads;
7070

7171
int foreground = 0;
7272

@@ -826,7 +826,7 @@ int main(int argc, char **argv)
826826
exit(1);
827827
}
828828

829-
noSlaveRenders = 0;
829+
num_slave_threads = 0;
830830

831831
int iconf = -1;
832832
char buffer[PATH_MAX];
@@ -873,6 +873,10 @@ int main(int argc, char **argv)
873873
config_slaves[render_sec].pid_filename = iniparser_getstring(ini,
874874
buffer, (char *) RENDERD_PIDFILE);
875875

876+
if (config_slaves[render_sec].num_threads == -1) {
877+
config_slaves[render_sec].num_threads = sysconf(_SC_NPROCESSORS_ONLN);
878+
}
879+
876880
if (render_sec == active_slave) {
877881
config.socketname = config_slaves[render_sec].socketname;
878882
config.iphostname = config_slaves[render_sec].iphostname;
@@ -890,7 +894,7 @@ int main(int argc, char **argv)
890894
config.mapnik_font_dir_recurse = iniparser_getboolean(ini,
891895
"mapnik:font_dir_recurse", MAPNIK_FONTS_DIR_RECURSE);
892896
} else {
893-
noSlaveRenders += config_slaves[render_sec].num_threads;
897+
num_slave_threads += config_slaves[render_sec].num_threads;
894898
}
895899
}
896900
}
@@ -1051,7 +1055,7 @@ int main(int argc, char **argv)
10511055
g_logger(G_LOG_LEVEL_INFO, "config renderd: num_threads=%d", config.num_threads);
10521056

10531057
if (active_slave == 0) {
1054-
g_logger(G_LOG_LEVEL_INFO, "config renderd: num_slaves=%d", noSlaveRenders);
1058+
g_logger(G_LOG_LEVEL_INFO, "config renderd: num_slave_threads=%d", num_slave_threads);
10551059
}
10561060

10571061
g_logger(G_LOG_LEVEL_INFO, "config renderd: tile_dir=%s", config.tile_dir);
@@ -1165,7 +1169,7 @@ int main(int argc, char **argv)
11651169
//Only the master renderd opens connections to its slaves
11661170
k = 0;
11671171
slave_threads
1168-
= (pthread_t *) malloc(sizeof(pthread_t) * noSlaveRenders);
1172+
= (pthread_t *) malloc(sizeof(pthread_t) * num_slave_threads);
11691173

11701174
for (i = 1; i < MAX_SLAVES; i++) {
11711175
for (j = 0; j < config_slaves[i].num_threads; j++) {

tests/CMakeLists.txt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
#-----------------------------------------------------------------------------
1212

1313
include(CTest)
14+
include(ProcessorCount)
15+
16+
processorcount(PROCESSOR_COUNT)
1417

1518
execute_process(COMMAND ${APXS_EXECUTABLE} -q progname
1619
OUTPUT_VARIABLE HTTPD_PROGNAME
@@ -635,6 +638,28 @@ foreach(STORAGE_BACKEND_INDEX RANGE ${STORAGE_BACKENDS_LENGTH})
635638
set_tests_properties(stats_urls_${STORAGE_BACKEND} PROPERTIES
636639
FIXTURES_REQUIRED "services_started_${STORAGE_BACKEND};tiles_downloaded_${STORAGE_BACKEND}"
637640
)
641+
if(NOT PROCESSOR_COUNT EQUAL 0)
642+
# Set CTEST_NUM_SLAVE_THREADS to 5 (renderd1 = 1, renderd2 = 4 [NUM_THREADS])
643+
set(CTEST_NUM_SLAVE_THREADS 5)
644+
add_test(
645+
NAME renderd_num_threads_${STORAGE_BACKEND}
646+
COMMAND ${BASH} -c "
647+
if ! ${GREP_EXECUTABLE} -q \"config renderd: num_threads=${PROCESSOR_COUNT}\" \"${RENDERD0_LOG}\"; then
648+
${GREP_EXECUTABLE} \"config renderd: num_threads=\" \"${RENDERD0_LOG}\"
649+
exit 1;
650+
fi
651+
if ! ${GREP_EXECUTABLE} -q \"config renderd: num_slave_threads=${CTEST_NUM_SLAVE_THREADS}\" \"${RENDERD0_LOG}\"; then
652+
${GREP_EXECUTABLE} \"config renderd: num_slave_threads=\" \"${RENDERD0_LOG}\"
653+
exit 1;
654+
fi
655+
"
656+
WORKING_DIRECTORY tests
657+
)
658+
set_tests_properties(renderd_num_threads_${STORAGE_BACKEND} PROPERTIES
659+
FIXTURES_REQUIRED services_started_${STORAGE_BACKEND}
660+
REQUIRED_FILES ${RENDERD0_LOG}
661+
)
662+
endif()
638663
add_test(
639664
NAME stop_services_${STORAGE_BACKEND}
640665
COMMAND ${BASH} -c "

tests/renderd.conf.in

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,13 @@ XML=@PROJECT_SOURCE_DIR@/utils/example-map/mapnik.xml
4242
[renderd1]
4343
iphostname=@RENDERD1_HOST@
4444
ipport=@RENDERD1_PORT@
45+
num_threads=1
4546
pid_file=@RENDERD1_PID@
4647
stats_file=@TEST_RUN_DIR@/renderd1_@STORAGE_BACKEND@.stats
4748
tile_dir=@TILE_DIR@
4849

4950
[renderd0]
51+
num_threads=-1
5052
pid_file=@RENDERD0_PID@
5153
socketname=@RENDERD0_SOCKET@
5254
stats_file=@TEST_RUN_DIR@/renderd0_@STORAGE_BACKEND@.stats

0 commit comments

Comments
 (0)