From 85f615132b054df7609edc2b93d6f823afdf4d67 Mon Sep 17 00:00:00 2001 From: arvidn Date: Fri, 18 Mar 2016 13:43:11 -0400 Subject: [PATCH 1/2] fix documentation mentions of session_settings to refer to settings_pack. clean out some outdated disk instrumentation docs --- Makefile.am | 6 - bindings/python/src/session.cpp | 4 +- docs/disk_access.png | Bin 3032 -> 0 bytes docs/disk_access_elevator.png | Bin 5768 -> 0 bytes docs/disk_access_no_elevator.png | Bin 5309 -> 0 bytes docs/disk_buffer.png | Bin 5170 -> 0 bytes docs/disk_buffer_before_optimization.png | Bin 4846 -> 0 bytes docs/disk_buffer_sample.png | Bin 5340 -> 0 bytes docs/features.rst | 58 +------- docs/hacking.rst | 2 +- docs/python_binding.rst | 11 +- docs/troubleshooting.dot | 4 +- docs/tuning.rst | 174 +++++----------------- include/libtorrent/add_torrent_params.hpp | 2 +- include/libtorrent/alert.hpp | 2 +- include/libtorrent/peer_connection.hpp | 2 +- include/libtorrent/peer_info.hpp | 4 +- include/libtorrent/session_handle.hpp | 6 +- include/libtorrent/settings_pack.hpp | 2 +- include/libtorrent/torrent_handle.hpp | 8 +- tools/Makefile.am | 2 +- tools/parse_disk_access.py | 102 ------------- 22 files changed, 59 insertions(+), 330 deletions(-) delete mode 100644 docs/disk_access.png delete mode 100644 docs/disk_access_elevator.png delete mode 100644 docs/disk_access_no_elevator.png delete mode 100644 docs/disk_buffer.png delete mode 100644 docs/disk_buffer_before_optimization.png delete mode 100644 docs/disk_buffer_sample.png delete mode 100755 tools/parse_disk_access.py diff --git a/Makefile.am b/Makefile.am index ca7e224c8..b5b424dbc 100644 --- a/Makefile.am +++ b/Makefile.am @@ -10,10 +10,6 @@ DOCS_IMAGES = \ docs/cwnd_thumb.png \ docs/delays.png \ docs/delays_thumb.png \ - docs/disk_access.png \ - docs/disk_buffer_before_optimization.png \ - docs/disk_buffer.png \ - docs/disk_buffer_sample.png \ docs/disk_io.png \ docs/hacking.html \ docs/im_thumb.jpg \ @@ -28,8 +24,6 @@ DOCS_IMAGES = \ docs/write_disk_buffers.png \ docs/write_disk_buffers.diagram \ docs/ziptorrent_thumb.gif \ - docs/disk_access_elevator.png \ - docs/disk_access_no_elevator.png\ docs/ip_id_v4.png \ docs/ip_id_v6.png \ docs/hash_distribution.png \ diff --git a/bindings/python/src/session.cpp b/bindings/python/src/session.cpp index 57ff83a1a..ac011917e 100644 --- a/bindings/python/src/session.cpp +++ b/bindings/python/src/session.cpp @@ -385,7 +385,7 @@ namespace allow_threading_guard guard; s.start_upnp(); } -#endif +#endif // TORRENT_NO_DEPRECATE #ifndef TORRENT_NO_DEPRECATE boost::shared_ptr @@ -792,7 +792,7 @@ void bind_session() .def("settings", &session_get_settings) .def("get_settings", &session_get_settings) #endif - .def("set_settings", &session_set_settings) + .def("apply_settings", &session_set_settings) #ifndef TORRENT_NO_DEPRECATE #ifndef TORRENT_DISABLE_ENCRYPTION .def("set_pe_settings", allow_threads(<::session::set_pe_settings)) diff --git a/docs/disk_access.png b/docs/disk_access.png deleted file mode 100644 index c236b6bb37a4fcb89294942cbc7f6bbe65d22b9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3032 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

4KrO9$$ZWL509 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 diff --git a/docs/disk_buffer.png b/docs/disk_buffer.png deleted file mode 100644 index fb617d0e68f786a77be8a343663be0764a374e0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5170 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 diff --git a/docs/disk_buffer_before_optimization.png b/docs/disk_buffer_before_optimization.png deleted file mode 100644 index dcb4c4560cc23a921b8e072a6d581a6ac0e8397e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4846 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 diff --git a/docs/features.rst b/docs/features.rst index 47b4a0a9e..a16d5a1b8 100644 --- a/docs/features.rst +++ b/docs/features.rst @@ -129,7 +129,7 @@ disk caching ------------ All disk I/O in libtorrent is done asynchronously to the network thread, by the -disk io thread. When a block is read, the disk io thread reads all subsequent +disk io threads. When a block is read, the disk io thread reads all subsequent blocks from that piece into the read cache, assuming that the peer requesting the block will also request more blocks from the same piece. This decreases the number of syscalls for reading data. It also decreases delay from seeking. @@ -155,62 +155,6 @@ The largest contiguous algorithm is the default and flushes the largest contiguo block of buffers, instead of flushing all blocks belonging to the piece which was written to least recently. -For version 0.15 a lot of work went into optimizing the cache algorithm, trying -to increase the cache hit rate and utilization. The graph to the left shows the -memory utilization in 0.14. This cache is a straight forward, fairly naive, implementation. -Every block read will also read all subsequent blocks in that piece into the cache. -Whenever we need more space, the entire oldest piece is evicted from the cache. Caching -writes always takes presedence over the read cache. Whenever a piece is fully downloaded, -it is flushed to disk. - -.. image:: disk_buffer_before_optimization.png - :width: 49% - -.. image:: disk_buffer.png - :width: 49% - -The left graph shows the problem of evicting entire pieces at a time, and waiting until -an entire piece is downloaded until flushing it. These graphs were generated for a torrent -with fairly large pieces. This means that granularity was poor in 0.14, since it only -dealt with entire pieces. In 0.15, the granularity problem has been fixed by evicting one -block at a time from the read cache. This maximizes the read cache utilization. The write -cache is also flushed when a sufficient number of contiguous blocks have been downloaded -for a piece, which is not tied to the piece size anymore. This way the cache scales a lot -better with piece sizes. - -The graph to the right shows the same download but with the new optimized disk cache -algorithm. It clearly shows an increased utilization, which means higher read hit rates -or smaller caches with maintained hit rate. - -high performance disk subsystem -------------------------------- - -In some circumstances, the disk cache may not suffice to provide maximum performance. -One such example is high performance seeding, to a large number of peers, over a fast -up-link. In such a case, the amount of RAM may simply not be enough to cache disk -reads. When there's not enough RAM to cache disk reads, the disk throughput would -typically degrade to perform as poorly as with no cache at all, with the majority -of the time spent waiting for the disk head to seek. - -To solve this problem, libtorrent sorts read requests by their physical offset on the -disk. They are processed by having the disk read head sweep back and forth over the drive. - -This makes libtorrent very suitable for large scale, high-throughput seeding. - -.. image:: disk_access_no_elevator.png - :width: 49% - -.. image:: disk_access_elevator.png - :width: 49% - -These plots illustrates the physical disk offset for reads over time. The left plot -is of a run where disk operation re-ordering is turned off and the righ is when it's -turned on. The right one has a relatively smooth sine wave shape whereas the left -one is more random and involves much longer seeks back and forth over the disk. - -True physical disk offset queries are only supported on newer linux kernels, Mac OS X and -Windows 2000 and up. - network buffers --------------- diff --git a/docs/hacking.rst b/docs/hacking.rst index 7a1de5d93..b96ce86dc 100644 --- a/docs/hacking.rst +++ b/docs/hacking.rst @@ -119,7 +119,7 @@ libtorrent starts 3 to 5 threads. * The third thread is the SHA-1 hash thread. By default there's only one hash thread, but on multi-core machines downloading at very high rates, libtorrent can be configured to start any number of hashing threads, to take full use of multi core systems. - (see ``session_settings::hashing_threads``). + (see ``settings_pack::hashing_threads``). * The fourth and fifth threads are spawned by asio on systems that don't support asynchronous host name resolution, in order to simulate non-blocking ``getaddrinfo()``. diff --git a/docs/python_binding.rst b/docs/python_binding.rst index 61f1960da..e6539984f 100644 --- a/docs/python_binding.rst +++ b/docs/python_binding.rst @@ -98,13 +98,12 @@ a list of entries. ``create_torrent::add_node()`` takes two arguments, one string and one integer, instead of a pair. The string is the address and the integer is the port. -``session::set_settings()`` not only accepts a ``session_settings`` object, but also -a dictionary with keys matching the names of the members of the ``session_settings`` struct. -When calling ``set_settings``, the dictionary does not need to have every settings set, -keys that are not present, are set to their default value. +``session::apply_settings()`` accepts a dictionary with keys matching the names +of settings in settings_pack. +When calling ``apply_settings``, the dictionary does not need to have every settings set, +keys that are not present are not updated. -For backwards compatibility, ``session::settings()`` still returns a ``session_settings`` -struct. To get a python dictionary of the settings, call ``session::get_settings``. +To get a python dictionary of the settings, call ``session::get_settings``. .. _`library reference`: reference.html diff --git a/docs/troubleshooting.dot b/docs/troubleshooting.dot index 7cf5af8a7..c26931e4c 100644 --- a/docs/troubleshooting.dot +++ b/docs/troubleshooting.dot @@ -28,7 +28,7 @@ digraph no_download { node_upload_mode [label="Is the torrent in upload mode?\n(torrent_status::upload_mode)"]; node_bwstate [label="What is the peer read_state set to?\n(peer_info::read_state)"]; - node_dl_limit [label="There is a download rate limit in affect on your peers.\nDo you have a download rate limit set?\n(session_settings::download_rate_limit)"]; + node_dl_limit [label="There is a download rate limit in affect on your peers.\nDo you have a download rate limit set?\n(settings_pack::download_rate_limit)"]; node_dl_disk [label="Peers are blocked waiting on the disk.\nThis typically means your disk is overloaded"]; @@ -36,7 +36,7 @@ digraph no_download { // end states - node_end_queued [label="This means the torrent is 'queued'. i.e. it will\nbe started once the torrents in front of it\ncompletes downloading. To know the queue\norder, see torrent_status::queue_position. To\nconfigure the number of simultaneous downloads,\nsee session_settings::active_limit and\nsession_settings::active_downloads."]; + node_end_queued [label="This means the torrent is 'queued'. i.e. it will\nbe started once the torrents in front of it\ncompletes downloading. To know the queue\norder, see torrent_status::queue_position. To\nconfigure the number of simultaneous downloads,\nsee settings_pack::active_limit and\nsettings_pack::active_downloads."]; node_end_stopped [label="This means the torrent is\n'stopped'. To start it call\ntorrent_handle::resume()."]; diff --git a/docs/tuning.rst b/docs/tuning.rst index d2297797f..b921cfec4 100644 --- a/docs/tuning.rst +++ b/docs/tuning.rst @@ -12,8 +12,8 @@ libtorrent manual tuning libtorrent ================= -libtorrent expose most constants used in the bittorrent engine for -customization through the ``session_settings``. This makes it possible to +libtorrent expose most parameters used in the bittorrent engine for +customization through the ``settings_pack``. This makes it possible to test and tweak the parameters for certain algorithms to make a client that fits a wide range of needs. From low memory embedded devices to servers seeding thousands of torrents. The default settings in libtorrent @@ -27,7 +27,7 @@ reducing memory footprint ========================= These are things you can do to reduce the memory footprint of libtorrent. You get -some of this by basing your default ``session_settings`` on the ``min_memory_usage()`` +some of this by basing your default ``settings_pack`` on the ``min_memory_usage()`` setting preset function. Keep in mind that lowering memory usage will affect performance, always profile @@ -58,9 +58,9 @@ disable disk cache The bulk of the memory libtorrent will use is used for the disk cache. To save the absolute most amount of memory, you can disable the cache by setting -``session_settings::cache_size`` to 0. You might want to consider using the cache +``settings_pack::cache_size`` to 0. You might want to consider using the cache but just disable caching read operations. You do this by settings -``session_settings::use_read_cache`` to false. This is the main factor in how much +``settings_pack::use_read_cache`` to false. This is the main factor in how much memory will be used by the client. Keep in mind that you will degrade performance by disabling the cache. You should benchmark the disk access in order to make an informed trade-off. @@ -94,8 +94,8 @@ connection, and might be worth considering if you have a very large number of peer connections. This memory will not be visible in your process, this sets the amount of kernel memory is used for your sockets. -Change this by setting ``session_settings::recv_socket_buffer_size`` and -``session_settings::send_socket_buffer_size``. +Change this by setting ``settings_pack::recv_socket_buffer_size`` and +``settings_pack::send_socket_buffer_size``. peer list size -------------- @@ -109,7 +109,7 @@ large number of paused torrents (that are popular) it will be even more significant. If you're short of memory, you should consider lowering the limit. 500 is probably -enough. You can do this by setting ``session_settings::max_peerlist_size`` to +enough. You can do this by setting ``settings_pack::max_peerlist_size`` to the max number of peers you want in a torrent's peer list. This limit applies per torrent. For 5 torrents, the total number of peers in peerlists will be 5 times the setting. @@ -117,7 +117,7 @@ the setting. You should also lower the same limit but for paused torrents. It might even make sense to set that even lower, since you only need a few peers to start up while waiting for the tracker and DHT to give you fresh ones. The max peer list size for paused -torrents is set by ``session_settings::max_paused_peerlist_size``. +torrents is set by ``settings_pack::max_paused_peerlist_size``. The drawback of lowering this number is that if you end up in a position where the tracker is down for an extended period of time, your only hope of finding live @@ -132,7 +132,7 @@ The send buffer watermark controls when libtorrent will ask the disk I/O thread to read blocks from disk, and append it to a peer's send buffer. When the send buffer has fewer than or equal number of bytes as -``session_settings::send_buffer_watermark``, the peer will ask the disk I/O thread +``settings_pack::send_buffer_watermark``, the peer will ask the disk I/O thread for more data to send. The trade-off here is between wasting memory by having too much data in the send buffer, and hurting send rate by starving out the socket, waiting for the disk read operation to complete. @@ -156,7 +156,7 @@ the whole piece in one read call, then hashes it. The second option is to optimize for memory usage instead, where a single buffer is allocated, and the piece is read one block at a time, hashing it as each block is read from the file. For low memory environments, this latter approach -is recommended. Change this by settings ``session_settings::optimize_hashing_for_speed`` +is recommended. Change this by settings ``settings_pack::optimize_hashing_for_speed`` to false. This will significantly reduce peak memory usage, especially for torrents with very large pieces. @@ -200,7 +200,7 @@ processes that might be of higher importance to the end-user, you can introduce between the disc accesses. This is a direct tradeoff between how fast you can check a torrent and how soft you will hit the disk. -You control this by setting the ``session_settings::file_checks_delay_per_block`` to greater +You control this by setting the ``settings_pack::file_checks_delay_per_block`` to greater than zero. This number is the number of milliseconds to sleep between each read of 16 kiB. The sleeps are not necessarily in between each 16 kiB block (it might be read in larger chunks), @@ -221,7 +221,7 @@ purpose of this is because of anti-virus software that hooks on file-open and fi scan the file. Anti-virus software that does that will significantly increase the cost of opening and closing files. However, for a high performance seed, the file open/close might be so frequent that it becomes a significant cost. It might therefore be a good idea to allow -a large file descriptor cache. Adjust this though ``session_settings::file_pool_size``. +a large file descriptor cache. Adjust this though ``settings_pack::file_pool_size``. Don't forget to set a high rlimit for file descriptors in your process as well. This limit must be high enough to keep all connections and files open. @@ -230,33 +230,33 @@ disk cache ---------- You typically want to set the cache size to as high as possible. The -``session_settings::cache_size`` is specified in 16 kiB blocks. Since you're seeding, -the cache would be useless unless you also set ``session_settings::use_read_cache`` +``settings_pack::cache_size`` is specified in 16 kiB blocks. Since you're seeding, +the cache would be useless unless you also set ``settings_pack::use_read_cache`` to true. In order to increase the possibility of read cache hits, set the -``session_settings::cache_expiry`` to a large number. This won't degrade anything as +``settings_pack::cache_expiry`` to a large number. This won't degrade anything as long as the client is only seeding, and not downloading any torrents. There's a *guided cache* mode. This means the size of the read cache line that's stored in the cache is determined based on the upload rate to the peer that triggered the read operation. The idea being that slow peers don't use up a disproportional amount of space in the cache. This is enabled through -``session_settings::guided_read_cache``. +``settings_pack::guided_read_cache``. In cases where the assumption is that the cache is only used as a read-ahead, and that no other peer will ever request the same block while it's still in the cache, the read cache can be set to be *volatile*. This means that every block that is requested out of the read cache is removed immediately. This saves a significant amount of cache space which can be used as read-ahead for other peers. To enable volatile read cache, set -``session_settings::volatile_read_cache`` to true. +``settings_pack::volatile_read_cache`` to true. SSD as level 2 cache -------------------- It is possible to introduce a second level of cache, below the RAM disk cache. This is done -by setting ``session_settings::mmap_cache`` to a file path pointing to the SSD drive, and -increasing the ``session_settings::cache_size`` to the number of 16 kiB blocks would fit +by setting ``settings_pack::mmap_cache`` to a file path pointing to the SSD drive, and +increasing the ``settings_pack::cache_size`` to the number of 16 kiB blocks would fit on the drive (or less). This will allocate disk buffers (for reading and writing) from a memory region that has @@ -280,7 +280,7 @@ throttle TCP to avoid it taking over all bandwidth. This balances the bandwidth between the two protocols. When running on a network where the bandwidth is in such an abundance that it's virtually infinite, this algorithm is no longer necessary, and might even be harmful to throughput. It is adviced to experiment with the -``session_setting::mixed_mode_algorithm``, setting it to ``session_settings::prefer_tcp``. +``session_setting::mixed_mode_algorithm``, setting it to ``settings_pack::prefer_tcp``. This setting entirely disables the balancing and unthrottles all connections. On a typical home connection, this would mean that none of the benefits of uTP would be preserved (the modem's send buffer would be full at all times) and uTP connections would for the most @@ -299,7 +299,7 @@ enough to not draining the socket's send buffer before the disk operation comple The watermark is bound to a max value, to avoid buffer sizes growing out of control. The default max send buffer size might not be enough to sustain very high upload rates, and you might have to increase it. It's specified in bytes in -``session_settings::send_buffer_watermark``. +``settings_pack::send_buffer_watermark``. peers ----- @@ -311,30 +311,30 @@ infinite, ``session::set_upload_rate_limit()``, passing 0 means infinite. When dealing with a large number of peers, it might be a good idea to have slightly stricter timeouts, to get rid of lingering connections as soon as possible. -There are a couple of relevant settings: ``session_settings::request_timeout``, -``session_settings::peer_timeout`` and ``session_settings::inactivity_timeout``. +There are a couple of relevant settings: ``settings_pack::request_timeout``, +``settings_pack::peer_timeout`` and ``settings_pack::inactivity_timeout``. For seeds that are critical for a delivery system, you most likely want to allow multiple connections from the same IP. That way two people from behind the same NAT can use the service simultaneously. This is controlled by -``session_settings::allow_multiple_connections_per_ip``. +``settings_pack::allow_multiple_connections_per_ip``. In order to always unchoke peers, turn off automatic unchoke -``session_settings::auto_upload_slots`` and set the number of upload slots to a large +``settings_pack::auto_upload_slots`` and set the number of upload slots to a large number via ``session::set_max_uploads()``, or use -1 (which means infinite). torrent limits -------------- -To seed thousands of torrents, you need to increase the ``session_settings::active_limit`` -and ``session_settings::active_seeds``. +To seed thousands of torrents, you need to increase the ``settings_pack::active_limit`` +and ``settings_pack::active_seeds``. SHA-1 hashing ------------- When downloading at very high rates, it is possible to have the CPU be the bottleneck for passing every downloaded byte through SHA-1. In order to enable calculating SHA-1 -hashes in parallel, on multi-core systems, set ``session_settings::hashing_threads`` +hashes in parallel, on multi-core systems, set ``settings_pack::hashing_threads`` to the number of threads libtorrent should start to do SHA-1 hashing. This defaults to 1, and only if that thread is close to saturating one core does it make sense to increase the number of threads. @@ -390,19 +390,7 @@ the disk I/O. The following table is an overview of these files and what they me +--------------------------+--------------------------------------------------------------+ | filename | description | +==========================+==============================================================+ -| ``disk_io_thread.log`` | This is a log of which operation the disk I/O thread is | -| | engaged in, with timestamps. This tells you what the thread | -| | is spending its time doing. | -| | | -+--------------------------+--------------------------------------------------------------+ -| ``disk_buffers.log`` | This log keeps track of what the buffers allocated from the | -| | disk buffer pool are used for. There are 5 categories. | -| | receive buffer, send buffer, write cache, read cache and | -| | temporary hash storage. This is key when optimizing memory | -| | usage. | -| | | -+--------------------------+--------------------------------------------------------------+ -| ``disk_access.log`` | This is a low level log of read and write operations, with | +| ``file_access.log`` | This is a low level log of read and write operations, with | | | timestamps and file offsets. The file offsets are byte | | | offsets in the torrent (not in any particular file, in the | | | case of a multi-file torrent). This can be used as an | @@ -412,106 +400,12 @@ the disk I/O. The following table is an overview of these files and what they me | | | +--------------------------+--------------------------------------------------------------+ - -disk_io_thread.log -'''''''''''''''''' - -The structure of this log is simple. For each line, there are two columns, a timestamp and -the operation that was started. There is a special operation called ``idle`` which means -it looped back to the top and started waiting for new jobs. If there are more jobs to -handle immediately, the ``idle`` state is still there, but the timestamp is the same as the -next job that is handled. - -Some operations have a 3:rd column with an optional parameter. ``read`` and ``write`` tells -you the number of bytes that were requested to be read or written. ``flushing`` tells you -the number of bytes that were flushed from the disk cache. - -This is an example excerpt from a log:: - - 3702 idle - 3706 check_fastresume - 3707 idle - 4708 save_resume_data - 4708 idle - 8230 read 16384 - 8255 idle - 8431 read 16384 - -The script to parse this log and generate a graph is called ``parse_disk_log.py``. It takes -the log file as the first command line argument, and produces a file: ``disk_io.png``. -The time stamp is in milliseconds since start. - -You can pass in a second, optional, argument to specify the window size it will average -the time measurements over. The default is 5 seconds. For long test runs, it might be interesting -to increase that number. It is specified as a number of seconds. - -.. image:: disk_io.png - -This is an example graph generated by the parse script. - -disk_buffers.log -'''''''''''''''' - -The disk buffer log tells you where the buffer memory is used. The log format has a time stamp, -the name of the buffer usage which use-count changed, colon, and the new number of blocks that are -in use for this particular key. For example:: - - 23671 write cache: 18 - 23671 receive buffer: 3 - 24153 receive buffer: 2 - 24153 write cache: 19 - 24154 receive buffer: 3 - 24198 receive buffer: 2 - 24198 write cache: 20 - 24202 receive buffer: 3 - 24305 send buffer: 0 - 24305 send buffer: 1 - 24909 receive buffer: 2 - 24909 write cache: 21 - 24910 receive buffer: 3 - -The time stamp is in milliseconds since start. - -To generate a graph, use ``parse_disk_buffer_log.py``. It takes the log file as the first -command line argument. It generates ``disk_buffer.png``. - -.. image:: disk_buffer_sample.png - -This is an example graph generated by the parse script. - -disk_access.log +file_access.log ''''''''''''''' -*The disk access log is now binary* - -The disc access log has three fields. The timestamp (milliseconds since start), operation -and offset. The offset is the absolute offset within the torrent (not within a file). This -log is only useful when you're downloading a single torrent, otherwise the offsets will not -be unique. - -In order to easily plot this directly in gnuplot, without parsing it, there are two lines -associated with each read or write operation. The first one is the offset where the operation -started, and the second one is where the operation ended. - -Example:: - - 15437 read 301187072 - 15437 read_end 301203456 - 16651 read 213385216 - 16680 read_end 213647360 - 25879 write 249036800 - 25879 write_end 249298944 - 26811 read 325582848 - 26943 read_end 325844992 - 36736 read 367001600 - 36766 read_end 367263744 - -The disk access log does not have any good visualization tool yet. There is however a gnuplot -file, ``disk_access.gnuplot`` which assumes ``disk_access.log`` is in the current directory. - -.. image:: disk_access.png - -The density of the disk seeks tells you how hard the drive has to work. +The disk access log is a binary file that can be parsed and converted to human +readable by the script ``tools/parse_access_log.py``. This tool produces a +graphical representation of the disk access and requires ``gnuplot``. understanding the disk threads ============================== diff --git a/include/libtorrent/add_torrent_params.hpp b/include/libtorrent/add_torrent_params.hpp index 00d1f8c7b..9baee8c68 100644 --- a/include/libtorrent/add_torrent_params.hpp +++ b/include/libtorrent/add_torrent_params.hpp @@ -188,7 +188,7 @@ namespace libtorrent // priorities for torrents in share mode, it will make it not work. // // The share mode has one setting, the share ratio target, see - // ``session_settings::share_mode_target`` for more info. + // ``settings_pack::share_mode_target`` for more info. flag_share_mode = 0x008, // determines if the IP filter should apply to this torrent or not. By diff --git a/include/libtorrent/alert.hpp b/include/libtorrent/alert.hpp index 2bcb3661b..ab6cba6cb 100644 --- a/include/libtorrent/alert.hpp +++ b/include/libtorrent/alert.hpp @@ -54,7 +54,7 @@ POSSIBILITY OF SUCH DAMAGE. // alerts (warnings, messages and errors from libtorrent). If no alerts have // been posted by libtorrent pop_alerts() will return an empty list. // -// By default, only errors are reported. session_settings::alert_mask can be +// By default, only errors are reported. settings_pack::alert_mask can be // used to specify which kinds of events should be reported. The alert mask is // comprised by bits from the category_t enum. // diff --git a/include/libtorrent/peer_connection.hpp b/include/libtorrent/peer_connection.hpp index 32301ddc1..7ce79c4b0 100644 --- a/include/libtorrent/peer_connection.hpp +++ b/include/libtorrent/peer_connection.hpp @@ -865,7 +865,7 @@ namespace libtorrent // this is the limit on the number of outstanding requests // we have to this peer. This is initialized to the settings - // in the session_settings structure. But it may be lowered + // in the settings_pack. But it may be lowered // if the peer is known to require a smaller limit (like BitComet). // or if the extended handshake sets a limit. // web seeds also has a limit on the queue size. diff --git a/include/libtorrent/peer_info.hpp b/include/libtorrent/peer_info.hpp index 849b38fde..73a99e56e 100644 --- a/include/libtorrent/peer_info.hpp +++ b/include/libtorrent/peer_info.hpp @@ -233,7 +233,7 @@ namespace libtorrent // the number of seconds until the current front piece request will time // out. This timeout can be adjusted through - // ``session_settings::request_timeout``. + // ``settings_pack::request_timeout``. // -1 means that there is not outstanding request. int request_timeout; @@ -317,7 +317,7 @@ namespace libtorrent // the number of bytes this peer has pending in the disk-io thread. // Downloaded and waiting to be written to disk. This is what is capped - // by ``session_settings::max_queued_disk_bytes``. + // by ``settings_pack::max_queued_disk_bytes``. int pending_disk_bytes; // number of outstanding bytes to read diff --git a/include/libtorrent/session_handle.hpp b/include/libtorrent/session_handle.hpp index b77e035b1..c696bcbd2 100644 --- a/include/libtorrent/session_handle.hpp +++ b/include/libtorrent/session_handle.hpp @@ -81,7 +81,7 @@ namespace libtorrent // saved when calling save_state(). enum save_state_flags_t { - // saves settings (i.e. the session_settings) + // saves settings (i.e. the settings_pack) save_settings = 0x001, // saves dht_settings @@ -844,7 +844,7 @@ namespace libtorrent // aren't working or fail, will automatically be disabled and packets // will flow without using any proxy. If you want to enforce using a // proxy, even when the proxy doesn't work, enable anonymous_mode in - // session_settings. + // settings_pack. TORRENT_DEPRECATED void set_proxy(proxy_settings const& s); TORRENT_DEPRECATED @@ -957,7 +957,7 @@ namespace libtorrent // The alert queue in the session will not grow indefinitely. Make sure // to pop periodically to not miss notifications. To control the max // number of alerts that's queued by the session, see - // ``session_settings::alert_queue_size``. + // ``settings_pack::alert_queue_size``. // // Some alerts are considered so important that they are posted even when // the alert queue is full. Some alerts are considered mandatory and cannot diff --git a/include/libtorrent/settings_pack.hpp b/include/libtorrent/settings_pack.hpp index 435cb13be..884240a40 100644 --- a/include/libtorrent/settings_pack.hpp +++ b/include/libtorrent/settings_pack.hpp @@ -136,7 +136,7 @@ namespace libtorrent // // Since this setting sets a hard upper limit on cache usage, it // cannot be combined with - // ``session_settings::contiguous_recv_buffer``, since that feature + // ``settings_pack::contiguous_recv_buffer``, since that feature // treats the ``cache_size`` setting as a soft (but still pretty hard) // limit. The result of combining the two is peers being disconnected // after failing to allocate more disk buffers. diff --git a/include/libtorrent/torrent_handle.hpp b/include/libtorrent/torrent_handle.hpp index dcb528467..383accd9e 100644 --- a/include/libtorrent/torrent_handle.hpp +++ b/include/libtorrent/torrent_handle.hpp @@ -598,7 +598,7 @@ namespace libtorrent // Explicitly sets the upload mode of the torrent. In upload mode, the // torrent will not request any pieces. If the torrent is auto managed, // it will automatically be taken out of upload mode periodically (see - // ``session_settings::optimistic_disk_retry``). Torrents are + // ``settings_pack::optimistic_disk_retry``). Torrents are // automatically put in upload mode whenever they encounter a disk write // error. // @@ -1101,7 +1101,7 @@ namespace libtorrent // ``set_download_limit`` works the same way but for download bandwidth // instead of upload bandwidth. Note that setting a higher limit on a // torrent then the global limit - // (``session_settings::upload_rate_limit``) will not override the global + // (``settings_pack::upload_rate_limit``) will not override the global // rate limit. The torrent can never upload more than the global rate // limit. // @@ -1170,7 +1170,7 @@ namespace libtorrent // at the same time on this torrent. If you set this to -1, there will be // no limit. This defaults to infinite. The primary setting controlling // this is the global unchoke slots limit, set by unchoke_slots_limit in - // session_settings. + // settings_pack. // // ``max_uploads()`` returns the current settings. void set_max_uploads(int max_uploads) const; @@ -1182,7 +1182,7 @@ namespace libtorrent // must be at least 2. The default is unlimited number of connections. If // -1 is given to the function, it means unlimited. There is also a // global limit of the number of connections, set by - // ``connections_limit`` in session_settings. + // ``connections_limit`` in settings_pack. // // ``max_connections()`` returns the current settings. void set_max_connections(int max_connections) const; diff --git a/tools/Makefile.am b/tools/Makefile.am index 6d12e2f5d..1cf4aee97 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -12,7 +12,7 @@ EXTRA_DIST = Jamfile \ parse_dht_log.py \ parse_dht_rtt.py \ parse_dht_stats.py \ - parse_disk_access.py \ + parse_access_log.py \ parse_disk_buffer_log.py\ parse_disk_log.py \ parse_memory_log.py \ diff --git a/tools/parse_disk_access.py b/tools/parse_disk_access.py deleted file mode 100755 index e88946425..000000000 --- a/tools/parse_disk_access.py +++ /dev/null @@ -1,102 +0,0 @@ -#!/usr/bin/env python - -import os, sys, time - -lines = open(sys.argv[1], 'rb').readlines() - -# logfile format: -# : -# example: -# 16434 read cache: 17 - -keys = ['read', 'write', 'head movement', 'seek per read byte', 'seek per written byte', - 'read operations per second', 'write operations per second'] -colors = ['305030', '503030', '3030f0', '10a010', 'a01010', 'd0d040', 'd040d0'] -style = ['dots', 'points', 'lines', 'lines', 'lines', 'lines', 'lines'] -axis = ['x1y1', 'x1y1', 'x1y2', 'x1y2', 'x1y2', 'x1y2', 'x1y2'] -plot = [True, False, False, False, False, True, False] - -out = open('disk_access_log.dat', 'w+') - -time = 1000000 - -last_pos = 0 -last_t = 0 -cur_movement = 0 -cur_read = 0 -cur_write = 0 -cur_read_ops = 0 -cur_write_ops = 0 - -for l in lines: - try: - # strip newline - l = l[0:-1].split(' ') - t = int(l[0]) - k = l[1] - n = int(l[2]) - except: - print l - continue - - read = '-' - write = '-' - movement = '-' - amount_read = '-' - amount_write = '-' - read_ops = '-' - write_ops = '-' - if k == 'read': - read = '%d' % n - cur_read_ops += 1 - if k == 'write': - write = '%d' % n - cur_write_ops += 1 - if k == 'read_end': cur_read += n - last_pos - if k == 'write_end': cur_write += n - last_pos - - cur_movement += abs(last_pos - n) - last_pos = n - - if last_t + time <= t: - movement = '%d' % cur_movement - if cur_read > 0: - amount_read = '%d' % (cur_movement / cur_read) - if cur_write > 0: - amount_write = '%d' % (cur_movement / cur_write) - read_ops = '%d' % cur_read_ops - write_ops = '%d' % cur_write_ops - cur_movement = 0 - cur_read = 0 - cur_write = 0 - last_t = t - cur_read_ops = 0 - cur_write_ops = 0 - - print >>out, '%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s' % (t, read, write, movement, amount_read, amount_write, read_ops, write_ops) - -out.close() - -out = open('disk_access.gnuplot', 'wb') -print >>out, "set term png size 1200,700" -print >>out, 'set output "disk_access.png"' -print >>out, 'set xrange [*:*]' -#print >>out, 'set y2range [0:*]' -print >>out, 'set xlabel "time (us)"' -print >>out, 'set ylabel "drive offset"' -#print >>out, 'set y2label "bytes / %d second(s)"' % (time / 1000) -print >>out, "set key box" -print >>out, "set tics nomirror" -print >>out, "set y2tics auto" -print >>out, 'plot', -count = 1 -for k in keys: - count += 1 - if not plot[count-2]: continue - print >>out, ' "disk_access_log.dat" using 1:%d title "%s" with %s lt rgb "#%s" axis %s,' \ - % (count, k, style[count-2], colors[count-2], axis[count-2]), -print >>out, 'x=0' -out.close() - -os.system('gnuplot disk_access.gnuplot') - From b446fe4bba34dc7a5dd49d694e585c05d680dcc5 Mon Sep 17 00:00:00 2001 From: arvidn Date: Fri, 18 Mar 2016 15:43:02 -0400 Subject: [PATCH 2/2] deprecate settings_pack::hashing_threads and replace it with aio_threads in documentation --- docs/hacking.rst | 2 +- docs/tuning.rst | 12 ++++++------ examples/client_test.cpp | 4 ++-- include/libtorrent/settings_pack.hpp | 6 ++++++ src/create_torrent.cpp | 2 +- src/session.cpp | 6 ------ src/settings_pack.cpp | 2 +- 7 files changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/hacking.rst b/docs/hacking.rst index b96ce86dc..a3e414189 100644 --- a/docs/hacking.rst +++ b/docs/hacking.rst @@ -119,7 +119,7 @@ libtorrent starts 3 to 5 threads. * The third thread is the SHA-1 hash thread. By default there's only one hash thread, but on multi-core machines downloading at very high rates, libtorrent can be configured to start any number of hashing threads, to take full use of multi core systems. - (see ``settings_pack::hashing_threads``). + (see ``settings_pack::aio_threads``). * The fourth and fifth threads are spawned by asio on systems that don't support asynchronous host name resolution, in order to simulate non-blocking ``getaddrinfo()``. diff --git a/docs/tuning.rst b/docs/tuning.rst index b921cfec4..96c8cd164 100644 --- a/docs/tuning.rst +++ b/docs/tuning.rst @@ -332,12 +332,12 @@ and ``settings_pack::active_seeds``. SHA-1 hashing ------------- -When downloading at very high rates, it is possible to have the CPU be the bottleneck -for passing every downloaded byte through SHA-1. In order to enable calculating SHA-1 -hashes in parallel, on multi-core systems, set ``settings_pack::hashing_threads`` -to the number of threads libtorrent should start to do SHA-1 hashing. This defaults -to 1, and only if that thread is close to saturating one core does it make sense to -increase the number of threads. +When downloading at very high rates, it is possible to have the CPU be the +bottleneck for passing every downloaded byte through SHA-1. In order to enable +calculating SHA-1 hashes in parallel, on multi-core systems, set +``settings_pack::aio_threads`` to the number of threads libtorrent should +perform I/O and do SHA-1 hashing in. Only if that thread is close to saturating +one core does it make sense to increase the number of threads. scalability =========== diff --git a/examples/client_test.cpp b/examples/client_test.cpp index 62e76ab7c..911737f2d 100644 --- a/examples/client_test.cpp +++ b/examples/client_test.cpp @@ -1243,7 +1243,7 @@ int main(int argc, char* argv[]) " previous command line options, so be sure to specify this first\n" " -G Add torrents in seed-mode (i.e. assume all pieces\n" " are present and check hashes on-demand)\n" - " -E specify how many hashing threads to use\n" + " -E specify how many disk I/O threads to use\n" "\n BITTORRENT OPTIONS\n" " -c sets the max number of connections\n" " -T sets the max number of connections per torrent\n" @@ -1401,7 +1401,7 @@ int main(int argc, char* argv[]) case 'B': settings.set_int(settings_pack::peer_timeout, atoi(arg)); break; case 'n': settings.set_bool(settings_pack::announce_to_all_tiers, true); --i; break; case 'G': seed_mode = true; --i; break; - case 'E': settings.set_int(settings_pack::hashing_threads, atoi(arg)); break; + case 'E': settings.set_int(settings_pack::aio_threads, atoi(arg)); break; case 'd': settings.set_int(settings_pack::download_rate_limit, atoi(arg) * 1000); break; case 'u': settings.set_int(settings_pack::upload_rate_limit, atoi(arg) * 1000); break; case 'S': diff --git a/include/libtorrent/settings_pack.hpp b/include/libtorrent/settings_pack.hpp index 884240a40..2a7f6af7d 100644 --- a/include/libtorrent/settings_pack.hpp +++ b/include/libtorrent/settings_pack.hpp @@ -1387,6 +1387,9 @@ namespace libtorrent // received by the metadata extension, i.e. magnet links. max_metadata_size, +#ifndef TORRENT_NO_DEPRECATE + // DEPRECTED: use aio_threads instead + // ``hashing_threads`` is the number of threads to use for piece hash // verification. It defaults to 1. For very high download rates, on // machines with multiple cores, this could be incremented. Setting it @@ -1394,6 +1397,9 @@ namespace libtorrent // any benefit of setting it to the number of cores. If it's set to 0, // hashing is done in the disk thread. hashing_threads, +#else + deprecated9, +#endif // the number of blocks to keep outstanding at any given time when // checking torrents. Higher numbers give faster re-checks but uses diff --git a/src/create_torrent.cpp b/src/create_torrent.cpp index 5ae63f89c..3992166f9 100644 --- a/src/create_torrent.cpp +++ b/src/create_torrent.cpp @@ -282,7 +282,7 @@ namespace libtorrent settings_pack sett; sett.set_int(settings_pack::cache_size, 0); - sett.set_int(settings_pack::hashing_threads, 2); + sett.set_int(settings_pack::aio_threads, 2); // TODO: this should probably be optional alert_manager dummy2(0, 0); diff --git a/src/session.cpp b/src/session.cpp index 6231deb3f..2278afd16 100644 --- a/src/session.cpp +++ b/src/session.cpp @@ -97,7 +97,6 @@ namespace libtorrent set.set_int(settings_pack::checking_mem_usage, 2); // don't use any extra threads to do SHA-1 hashing - set.set_int(settings_pack::hashing_threads, 0); set.set_int(settings_pack::network_threads, 0); set.set_int(settings_pack::aio_threads, 1); @@ -274,11 +273,6 @@ namespace libtorrent // connect to us if they want to set.set_int(settings_pack::max_failcount, 1); - // we're likely to have more than 4 cores on a high - // performance machine. One core is needed for the - // network thread - set.set_int(settings_pack::hashing_threads, 4); - // the number of threads to use to call async_write_some // and read_some on peer sockets // this doesn't work. See comment in settings_pack.cpp diff --git a/src/settings_pack.cpp b/src/settings_pack.cpp index 0dace4240..4a563a52c 100644 --- a/src/settings_pack.cpp +++ b/src/settings_pack.cpp @@ -316,7 +316,7 @@ namespace libtorrent SET(torrent_connect_boost, 10, 0), SET(alert_queue_size, 1000, &session_impl::update_alert_queue_size), SET(max_metadata_size, 3 * 1024 * 10240, 0), - SET(hashing_threads, 1, 0), + DEPRECATED_SET(hashing_threads, 1, 0), SET(checking_mem_usage, 256, 0), SET(predictive_piece_announce, 0, 0), SET(aio_threads, 4, &session_impl::update_disk_threads),