diff --git a/docs/manual.rst b/docs/manual.rst index a7612f9a0..faa590c09 100644 --- a/docs/manual.rst +++ b/docs/manual.rst @@ -3369,6 +3369,7 @@ session_settings bool auto_upload_slots_rate_based; bool use_parole_mode; int cache_size; + int cache_buffer_chunk_size; int cache_expiry; bool use_read_cache; bool disk_io_no_buffer; @@ -3613,6 +3614,11 @@ send or receive buffer also count against this limit. Send and receive buffers will never be denied to be allocated, but they will cause the actual cached blocks to be flushed or evicted. +Disk buffers are allocated using a pool allocator, the number of blocks that +are allocated at a time when the pool needs to grow can be specified in +``cache_buffer_chunk_size``. This defaults to 16 blocks. Lower numbers +saves memory at the expense of more heap allocations. It must be at least 1. + ``cache_expiry`` is the number of seconds from the last cached write to a piece in the write cache, to when it's forcefully flushed to disk. Default is 60 second. diff --git a/include/libtorrent/session_settings.hpp b/include/libtorrent/session_settings.hpp index f39dfd089..97a037887 100644 --- a/include/libtorrent/session_settings.hpp +++ b/include/libtorrent/session_settings.hpp @@ -124,6 +124,7 @@ namespace libtorrent , auto_upload_slots_rate_based(true) , use_parole_mode(true) , cache_size(1024) + , cache_buffer_chunk_size(16) , cache_expiry(60) , use_read_cache(true) , disk_io_write_mode(0) @@ -383,6 +384,12 @@ namespace libtorrent // default is 512 (= 8 MB) int cache_size; + // this is the number of disk buffer blocks (16 kiB) + // that should be allocated at a time. It must be + // at least 1. Lower number saves memory at the expense + // of more heap allocations + int cache_buffer_chunk_size; + // the number of seconds a write cache entry sits // idle in the cache before it's forcefully flushed // to disk. Default is 60 seconds. diff --git a/src/disk_io_thread.cpp b/src/disk_io_thread.cpp index e8ddc3f36..60168a82d 100644 --- a/src/disk_io_thread.cpp +++ b/src/disk_io_thread.cpp @@ -52,7 +52,7 @@ namespace libtorrent : m_block_size(block_size) , m_in_use(0) #ifndef TORRENT_DISABLE_POOL_ALLOCATOR - , m_pool(block_size, 16) + , m_pool(block_size, m_settings.cache_buffer_chunk_size) #endif { #if defined TORRENT_DISK_STATS || defined TORRENT_STATS @@ -95,7 +95,7 @@ namespace libtorrent char* ret = page_aligned_allocator::malloc(m_block_size); #else char* ret = (char*)m_pool.ordered_malloc(); - m_pool.set_next_size(16); + m_pool.set_next_size(m_settings.cache_buffer_chunk_size); #endif ++m_in_use; #if TORRENT_USE_MLOCK @@ -162,7 +162,7 @@ namespace libtorrent char* ret = page_aligned_allocator::malloc(m_block_size * num_blocks); #else char* ret = (char*)m_pool.ordered_malloc(num_blocks); - m_pool.set_next_size(16); + m_pool.set_next_size(m_settings.cache_buffer_chunk_size); #endif m_in_use += num_blocks; #if TORRENT_USE_MLOCK diff --git a/src/session.cpp b/src/session.cpp index 030eab15b..3a867fdfd 100644 --- a/src/session.cpp +++ b/src/session.cpp @@ -148,6 +148,7 @@ namespace libtorrent // don't use any disk cache set.cache_size = 0; + set.cache_buffer_chunk_size = 1; set.use_read_cache = false; set.close_redundant_connections = true; @@ -190,12 +191,12 @@ namespace libtorrent // use 128 MB of cache set.cache_size = 8192; set.use_read_cache = true; + set.cache_buffer_chunk_size = 64; set.close_redundant_connections = true; set.max_rejects = 10; - // use less memory when checking pieces set.optimize_hashing_for_speed = true; return set;