- Пользовательские максимальная ширина и высота окна?
- Какие параметры влияют на производительность приложений? Часть 1. TCP Window Size
- Размер окна и буфера экрана Window and Screen Buffer Size
- Тонкая Настройка TCP
- Как Работает TCP
- Рассчитываем Размер Буфера TCP
- Устанавливаем размер буфера TCP
- Устанавливаем Максимальный Размер буфера TCP
- От Теории к Практике
- Linux на Помощь
- Наладка Сети
- Обратите Внимание на Программу scp
Пользовательские максимальная ширина и высота окна?
среда: я на Windows, у меня есть XP и 7, так что оба мне интересны. Планируйте установить Linux, чтобы это тоже было актуально.
проблема: у меня достаточно места на экране, и увеличение окна часто делает их просто «слишком большими» для меня.
Конечно, я могу подгонять их по размеру так, как я хочу. Но было бы удобно, если бы я мог настроить ширину окна / высоту автоматически.
Я представляю что-то вроде этого: я нажимаю кнопку клавиатуры или кнопку графического интерфейса пользователя, и размер окна изменяется на 520×490 (это будет моя пользовательская настройка). Проблема в том, что я могу сделать это с помощью браузера через надстройки, но не с помощью какого-либо окна ОС (размер которого можно изменять).
Лучше всего было бы, если бы я мог сделать это для каждого приложения, а также предоставить настройки по умолчанию для приложений, которые я не указал.
Не нужно переопределять кнопку максимизации и другие обычные кнопки, но если это то, что нужно, это тоже нормально. Но я хотел бы остаться в состоянии переместиться между тем и позже изменить их размер, если я хочу.
Есть ли способ легко изменить размер окон ОС до сохраненной предпочтительной ширины и высоты?
ОБНОВЛЕНИЕ 1: если я изменю размер окна вручную после того, как оно было установлено на «предпочтительный размер», позже я смогу легко изменить его размер до «предпочтительного размера», не закрывая и не открывая его снова.
С другой стороны, положение не является обязательным требованием. Если это сохранено, это лучше как дополнительное.
Какие параметры влияют на производительность приложений? Часть 1. TCP Window Size
Самый простой способ понять значение термина размер TCP окна (TCP Window Size), это представить разговор двух человек. Один человек говорит, а второй кивает головой или говорит да, тем самым подтверждая, что он понял, а по сути, получил все слова, которые ему были сказаны. После этого разговор продолжается. Если мы встречаем особо говорливого человека, то наша голова быстро загружается, и мы начинаем терять нить разговора или переспрашивать нашего собеседника. Тоже самое происходит и в Матрице — в мире цифр и машин.
Размер TCP окна (TCP Window Size) – количество октетов (начиная с номера подтверждения), которое принимающая сторона готова принять в настоящий момент без подтверждения. На стадии установления соединения рабочая станция и сервер обмениваются значениями максимального размера TCP окна (TCP Window Size), которые присутствуют в пакете и эти значения можно легко увидеть, воспользовавшись захватом трафика.
Например, если размер окна получателя равен 16384 байта, то отправитель может отправить 16384 байта без остановки. Принимая во внимание, что максимальная длина сегмента (MSS) может быть 1460 байт, то отправитель сможет передать данный объем в 12 фреймах, и затем будет ждать подтверждение доставки от получателя и информации по обновлению размера окна. Если процесс прошел без ошибок, то размер окна может быть увеличен. Таким образом, реализуется размер скользящего окна в стеке протокола TCP.
В зависимости от состояния каналов связи, размер окна может быть больше или меньше. Каналы связи могут быть высокоскоростными (большая пропускная способность) и протяженными (большая задержка и возможно потери), поэтому при небольшом размере TCP окна мы будем вынуждены отправлять один или несколько фреймов и ждать подтверждения от получателя, затем процесс повторяется. Таким образом, наши приложения будут неэффективно использовать доступную полосу пропускания. Пакетов будет много, но реального полезного трафика будет передано не много. Чтобы получить максимальную пропускную способность, необходимо использовать оптимально установленный размер передающего и принимающего окна для канала, который вы используете.
Для расчёта максимального размера окна (т.е. максимальный объем данных, которые могут передаваться одним пользователем другому в канале связи) рассчитывается по формуле:
Полоса пропускания (бит/сек) * RTT (круговое время передачи по сети) = размер окна в битах
Таким образом, если ваши два офиса соединяет канал связи в 10 Мбит/сек и круговое время составляет 85 миллисекунд, то воспользовавшись данной формулой, мы получим значение окна равное:
10 000 000 * 0,085 / 8 = 106250 байт
Размер поля Window в заголовке TCP составляет 16 бит; это означает, что узел TCP может указать максимальный размер TCP окна 65535 байт. Таким образом, максимальная пропускная способность составляет:
65535 * 8 / 0,085 = 6,2 Мбит/сек
т.е. чуть больше 50% от реально доступной полосы пропускания канала.
В современных версиях операционных систем можно увеличить размер окна TCP Window Size и включить динамическое изменение окна в зависимости от состояния канала связи. В предложении RFC 1323 дано определение масштабирования окон, позволяющего получателю указывать размер окна больше 65535 байт, что позволит применять большие размеры окон и высокоскоростные каналы передачи. Параметр TCP Window Scale указывает коэффициент масштабирования окна, который в сочетании с 16-битным полем Window в заголовке TCP может увеличивать размер окна приема до максимального значения, составляющего примерно 1 ГБ. Параметр Window Scale отправляется только в сегментах синхронизации (SYN) при установке соединения. На нашем скриншоте из WireShark он составляет 256. Устройства, общающиеся друг с другом, могут указывать разные коэффициенты масштабирования для TCP окон.
Таким образом, активировав масштабирование окон TCP и уменьшив круговое время передачи по сети, мы сможем повысить эффективность использования доступной полосы пропускания и как следствие скорость работы приложений. А проверить это можно захватив пакеты, и посмотреть о каких значениях размера окна и коэффициенте масштабирования договорились устройства в момент установки соединения. Это динамическое увеличение и уменьшение размера окна является непрерывным процессом в TCP и определяет оптимальный размер окна для каждого сеанса. В очень эффективных сетях размеры окна могут стать очень большими, потому что данные не теряются. В сетях, где сетевая инфраструктура перегружена, размер окна, вероятно, останется маленьким.
Размер окна и буфера экрана Window and Screen Buffer Size
Размер буфера экрана выражается в виде координатной сетки, основанной на ячейках символов. The size of a screen buffer is expressed in terms of a coordinate grid based on character cells. Ширина — это число ячеек символов в каждой строке, а высота — число строк. The width is the number of character cells in each row, and the height is the number of rows. Связанный с каждым буфером экрана — это окно, определяющее размер и расположение прямоугольной части буфера экрана консоли, отображаемой в окне консоли. Associated with each screen buffer is a window that determines the size and location of the rectangular portion of the console screen buffer displayed in the console window. Окно буфера экрана определяется с помощью указания координат символьной ячейки в верхней левой и нижней правой ячейках прямоугольника окна. A screen buffer’s window is defined by specifying the character-cell coordinates of the upper left and lower right cells of the window’s rectangle.
В мире виртуальных последовательностей терминалов размер окна и размер буфера экрана фиксируются для одного и того же значения. In the virtual terminal sequences world, the size of the window and the size of the screen buffer are fixed to the same value. Терминал обрабатывает любой регион скроллбакк, который будет эквивалентом консоли с размером буфера экрана, превышающим размер окна. The terminal handles any scrollback region that would be the equivalent of a console with a screen buffer size larger than its window size. Это содержимое принадлежит терминалу и, как правило, больше не является частью области с адресацией. That content belongs to the terminal and is generally no longer a part of the addressable area. Дополнительные сведения см. в статье сравнение классических функций консоли и виртуальных последовательностей терминалов . For more information, please see our comparison of the classic console functions versus virtual terminal sequences .
Буфер экрана может иметь любой размер, ограниченный только объемом доступной памяти. A screen buffer can be any size, limited only by available memory. Размеры окна буфера экрана не могут превышать соответствующие размеры буфера экрана консоли или максимального окна, которое может уместиться на экране на основе текущего размера шрифта (управляется исключительно пользователем). The dimensions of a screen buffer’s window cannot exceed the corresponding dimensions of either the console screen buffer or the maximum window that can fit on the screen based on the current font size (controlled exclusively by the user).
Функция жетконсолескринбуфферинфо возвращает следующие сведения о буфере экрана и его окне: The GetConsoleScreenBufferInfo function returns the following information about a screen buffer and its window:
- Текущий размер буфера экрана консоли The current size of the console screen buffer
- Текущее расположение окна The current location of the window
- Максимальный размер окна, учитывая текущий размер буфера экрана, текущий размер шрифта и размер экрана The maximum size of the window given the current screen buffer size, the current font size, and the screen size
Функция жетларжестконсолевиндовсизе Возвращает максимальный размер окна консоли на основе текущего шрифта и размеров экрана. The GetLargestConsoleWindowSize function returns the maximum size of a console’s window based on the current font and screen sizes. Этот размер отличается от максимального размера окна, возвращенного жетконсолескринбуфферинфо в том случае, если размер буфера экрана консоли не учитывается. This size differs from the maximum window size returned by GetConsoleScreenBufferInfo in that the console screen buffer size is ignored.
Чтобы изменить размер буфера экрана, используйте функцию сетконсолескринбуфферсизе . To change a screen buffer’s size, use the SetConsoleScreenBufferSize function. Эта функция завершается ошибкой, если любое измерение указанного размера меньше, чем соответствующее измерение окна консоли. This function fails if either dimension of the specified size is less than the corresponding dimension of the console’s window.
Чтобы изменить размер или расположение окна буфера экрана, используйте функцию сетконсолевиндовинфо . To change the size or location of a screen buffer’s window, use the SetConsoleWindowInfo function. Эта функция завершается ошибкой, если указанные координаты углового окна превышают пределы буфера экрана консоли или экрана. This function fails if the specified window-corner coordinates exceed the limits of the console screen buffer or the screen. Изменение размера окна активного буфера экрана изменяет размер окна консоли, отображаемого на экране. Changing the window size of the active screen buffer changes the size of the console window displayed on the screen.
Процесс может изменить входной режим консоли, чтобы разрешить входные данные окна, чтобы процесс мог получать входные данные, когда пользователь изменяет размер буфера экрана консоли. A process can change its console’s input mode to enable window input so that the process is able to receive input when the user changes the console screen buffer size. Если приложение включает входные данные окна, оно может использовать жетконсолескринбуфферинфо для извлечения размера окна и буфера экрана при запуске. If an application enables window input, it can use GetConsoleScreenBufferInfo to retrieve window and screen buffer size at startup. Эти сведения можно затем использовать для определения способа отображения данных в окне. This information can then be used to determine the way data is displayed in the window. Если пользователь изменяет размер буфера экрана консоли, приложение может ответить, изменив способ отображения данных. If the user changes the console screen buffer size, the application can respond by changing the way data is displayed. Например, приложение может настроить способ переноса текста в конце строки при каждом изменении количества символов в строке. For example, an application can adjust the way text wraps at the end of the line if the number of characters per row changes. Если приложение не включает входные данные окна, оно должно либо использовать унаследованные размеры окон и буферов экрана, либо задать требуемый размер во время запуска и восстановить унаследованные размеры при выходе. If an application does not enable window input, it must either use the inherited window and screen buffer sizes, or set them to the desired size during startup and restore the inherited sizes at exit. Дополнительные сведения о режиме ввода окна см. в разделе режимы консоли низкого уровня. For additional information about window input mode, see Low-Level Console Modes.
Тонкая Настройка TCP
Слишком часто разработчики винят недостаточную производительность сети, хотя на самом деле зачастую причина в неправильно настроенном программном обеспечении. В этой статье описаны некоторые утилиты для анализа и настройки сети, которые позволяют разработчикам оптимизировать свои приложения для оптимизации сетевых возможностей.
Как-то раз мой друг Боб пришел ко мне с вопросом. Он написал программу на Java, которая копировала 100 МБ файлы с его компьютера под управлением Windows XP в его офисе на Linux-сервер в региональный офис компании. В обоих офисах используются 100Мбит сети Ethernet, соединенные через 155Mbps VPN канал. Однако он был очень неприятно удивлен тем, что измеренная скорость передачи была ниже 4Мбит, и попросил меня объяснить причину такого поведения.
В результате я написал эту статью, чтобы объяснить причину такого поведения и что должен сделать Боб, чтобы максимально использовать пропускную способность своей сети. Слишком часто разработчики винят недостаточную производительность сети, хотя на самом деле зачастую причина в неправильно настроенном программном обеспечении. В этой статье описаны некоторые утилиты для анализа и настройки сети, которые позволяют разработчикам оптимизировать свои приложения для оптимизации сетевых возможностей.
Как Работает TCP
Самый распространенный сетевой протокол, используемый в Интернет это Transmission Control Protocol, или TCP . TCP использует «окно перегрузки» — число пакетов, которое должен послать или принять стек, прежде чем перейти в режим ожидания сигнала подтверждения. Чем больше размер этого окна, тем выше пропускная способность. Алгоритмы «медленного запуска» и «предотвращения перегрузки» определяют размер окна перегрузки. Максимальный размер окна перегрузки зависит от размера буфера, который ядро отводит для каждого сокета. Для каждого сокета существует значение буфера, установленное по умолчанию, которое программы могут изменять, используя системный вызов библиотек перед открытием сокета. Для некоторых операционных систем существует определенный максимум размера буфера на уровне ядра. Вы можете установить собственное значение буфера как для отправляющего, так и для принимающего конца сокета.
Чтобы достичь максимальной скорости, важно использовать оптимальный размер буфера для TCP сокета для используемого подключения. Если буферы слишком маленькие, окно перегрузки TCP некогда не откроется полностью, таким образом отправитель не сможет работать по полной. Если буферы слишком большие, отправитель попросту завалит получателя, что приведет к тому, что получатель просто будет резать пакеты и окно перегрузки выключится. Наиболее вероятна такая ситуация когда отправляющий хост по производительности лучше, чем получающий. Слишком большое окно на отправляющей стороне это не проблема, пока существует некоторый избыток памяти.
Рассчитываем Размер Буфера TCP
Предположим, что сеть не перегружена и пакеты в ней не теряются, тогда пропускная способность сети зависит прямо пропорционально от размера TCP буфера и сетевой задержки. Сетевая задержка есть не что иное, как количество времени, необходимое пакету для прохода через сеть. Чтобы сосчитать максимальную пропускную способность, нужно:
Пропускная способность = размер буфера / задержка
В обычной сети задержка между двумя офисами составит около 40ms, а в Windows XP размер буфера по умолчанию равен 17,520 байт. Значит, максимальная пропускная способность будет равна:
Размер буфера по умолчанию для Mac OS X установлен в 64K, таким образом, при использовании Mac OS X у Боба получилось бы лучше, однако были бы достигнуты далеко не 100Mbps, которые по идее должны быть.
(Люди, которые постоянно используют сеть, думают о битах в секунду, тогда как все оставшиеся думают о байтах, что часто приводит к путанице.)
Большинство экспертов по сетям соглашаются, что оптимальный размер буфера для определенной сети равен удвоенному произведению задержки и полосы пропускания:
Программа ping даст вам округленное время (round trip time — RTT) для сетевого соединения, что в два раза больше задержки. Формула принимает следующий вид:
Для сети Боба ping вернул RTT в 80ms. Это значит, что размер буфера TCP должен быть:
Боб знал скорость VPN канала компании, но часто вы не знаете о пропускной способности сетевого маршрута. Определить пропускную способность сети иногда очень сложно. На сегодняшний день самой большой пропускной способностью является 1Gbps (в США, Европе и Японии), получается, что узкое место это местные сети на обоих концах. В моей практике я встречал в основном офисы, где компьютеры объединены 100Mbps сетью Ethernet. Тогда имеем следующую картину: 100Mbps=12MBps, что, согласитесь, совсем неплохо.
Перенастройка размера буфера никак не повлияет на производительность в сетях, где регламентированная скорость составляет 10Mbps или ниже; например, с хостами, соединенными через DSL, кабельный модем, ISDN, или линию T1. Существует программа pathrate, которая выполняет хорошую работу: оценивает пропускную способность. Но она не позволяет проводить глубокий анализ полученных временных рядов. Например, не ставилась задача получать различные функции распределения, а так же недостаточен набор параметров, которые можно варьировать при проведении измерений. Программа работает только на платформе Linux и требует возможности логина на оба компьютера.
Устанавливаем размер буфера TCP
Итак, имеем две настройки, которые нужно оптимизировать: размер буфера TCP по умолчанию и максимальный размер буфера. С правами пользователя можно изменить размер буфера по умолчанию, но для изменения его максимального размера требуются права администратора. Заметьте, что большинство сегодняшних Unix-Like систем по умолчанию имеют значение максимального размера буфера TCP всего лишь 256K. В Windows нет максимального размера буфера по умолчанию, но администратор может его установить. Очень важно изменить размеры буферов у посылающей и принимающей машин. Изменение только отправляющего буфера не даст ничего, т.к. TCP согласовывает размер буфера с меньшим из двух. Это означает, что не обязательно устанавливать оптимальный размер буфера на отправляющей и принимающей машинах. Обычно делают следующее: устанавливают размер буфера на серверной стороне довольно большим (например 1,024K) и затем позволяют клиенту определить и установить «оптимальное» значение для данного сетевого маршрута. Чтобы установить размер буфера TCP, используйте метода setSendBufferSize и setReceiveBufferSize в Java, или вызов setsockopt в С. Ниже представлен пример установки размеров буфера ТСР в пределах приложения на Java:
Хорошей идеей будет вызвать getSendBufferSize (или getReceiveBufferSize) после установки размера буфера. Таким образом, мы удостоверимся, что наша ОС поддерживает буферы таких размеров. Вызов setsockopt не вернет ошибку, если вы используете значение, большее чем максимальный размер буфера, но попросту будет использовать максимальный размер вместо значения, которое установили вы. Linux загадочным образом удваивает значение, которое вы передаете для размера буфера, так что когда вы делаете getSendBufferSize / getReceiveBufferSize и видите в два раза больше, чем указали, не волнуйтесь — для Linux это «нормально».
А вот и пример на С:
Фрагмент кода на С, проверяющий текущий размер буфера:
Устанавливаем Максимальный Размер буфера TCP
Для большинства соединений невозможно увеличить предопределенный системой максимальный размер ТСР буфера. Например, возьмем соединение в 100Mbps между Калифорнией и Великобританией, время задержки RTT которого 150 мсек. Оптимальный размер буфера для такого соединения будет равен 1,9 МБ, что в 30 раз больше чем размер буфера по умолчанию и в 7,5 раз больше, чем максимальный размер буфера ТСР в Linux.
Чтобы поменять параметры ТСР в Linux, добавьте следующие строки в файл / etc/sysctl.conf , и затем запустите sysctl -p. Теперь наши настройки будут применяться во время загрузки.
Устанавливайте максимальные размеры буферов таким образом, чтобы полностью использовать ресурсы соединения. В Windows не требуется вносить каких-либо изменений, как например максимальный размер буфера ТСР по умолчанию (GlobalMaxTcpWindowSize) не определяется. На моем сайте TCP Tuning Guide web site можно найти информацию о том, как установить максимальный размер буфера в других операционных системах.
От Теории к Практике
Наверняка сейчас у вас возник вопрос «А как же я могу осуществить все эти возможности в реальных условиях? Доверить ли пользователям установку размера буфера? Стоит ли подсчитать оптимальный размер буфера для пользователя? Или может вообще стоит установить больший буфер и больше не вспоминать об этом?»
Обычно, я предлагаю следующее для большинства приложений, ориентированных на высокоскоростную (более 40Mbps), с большой задержкой (RTT > 10ms) сеть. Ваш клиент должен запустить ping, чтобы определить RTT и затем просто принять пропускную способность, равную 100Mbps. Ping трафик блокируется некоторыми сайтами. В этом случае можно воспользоваться утилитой synack, которая использует ТСР вместо ICMP для определения RTT. Если ваши пользователи разбираются в сетях, то можно предоставить им самим самостоятельно выбирать размер TCP буфера. Не правильно тупо устанавливать большие размеры буферов для всех сетевых маршрутов, особенно если приложение могут запустить через медленные линии, такие как DSL или модемы.
Linux на Помощь
Начиная с версии 2.4, в Linux добавлена возможность автоподстройки ТСР буфера отправителя . Это означает, что отправителю больше не нужно задумываться о вызове setsockopt(). Однако все еще следует выполнять setsockopt() на стороне получателя, и вам придется подкорректировать максимальный размер буфера при автоподстройке, что по умолчанию составляет лишь 128 кБ. Начиная с Linux 2.6.7, была добавлена функция автоподстройки для серверной стороны, таким образом вам не нужно больше думать о получателе. Свершилось! К несчастью, максимальный размер буфера ТСР все еще маленький — но хотя бы теперь это проблема системного администрирования, а не программиста.
Мои начальные результаты довольно-таки внушительные. После увеличения максимальных буферов ТСР, при соединении в 1Gbps через США (RTT = 67ms), производительность с 10Mbps при использовании Linux 2.4 поднялась до 700Mbps при использовании Linux 2.6.12, ускорение в 70 раз! На соединении из Калифорнии в Великобританию (RTT = 150 мсек), скорость с 4Mbps на Linux 2.4 выросла до 560Mbps — ускорение в 140 раз. Этого удалось достичь всего лишь увеличением максимального размера буфера ТСР.
В Linux 2.6 кроме того включены некоторые улучшения ТСР, что означает, что скорость можно увеличить еще в несколько раз. Особенно то, что в Linux 2.6 теперь используется алгоритм контроля перегрузки BIC (BIC — bus interface controller, контроллер магистрального интерфейса), который задумывался для увеличения производительности ТСР при использовании высокоскоростных линий и большими задержками. Ручная подстройка Linux 2.4 при использовании тех же соединений дает пропускную способность в 300Mbps через США и 70Mbps до Великобритании. Надеюсь, в скором времени все эти прелести появятся в Windows.
Наладка Сети
Если все попытки повысить пропускную способность закончились неудачей, то, скорее всего причина в самой сети. Итак, сначала попробуйте netstat -s, чтобы посмотреть количество повторных передач. Если их много, то это говорит о том, что сеть перегружена, построена на плохом «железе» или вовсе с нарушением топологии. Также повторные передачи происходят в случае, когда отправляющая машина намного быстрее принимающей. Также обратите внимание на число ошибок, возвращаемых netstat- большое число ошибок также говорит о проблеме в самой сети. Мне самому с трудом верится, но очень часто причина неполадок LAN с сетями 100BT заключается в том, что хост настроен на работу в полном дуплексе, а свитч Ethernet работает в режиме полудуплекса, или наоборот. Новое оборудование автоматически согласует дуплексы, тогда как со старым могут возникнуть проблемы, результатом будет работающая, но ужасно медленная сеть. Лучше всего работать в режиме полного дуплекса, но некоторое старое оборудование 100ВТ поддерживает только полудуплекс. Смотрите TCP Tuning Guide, чтобы узнать, как проверить настройки дуплекса для вашего компьютера.
Internet2’s Network Diagnostic Tool (NDT) — отличная утилита, предназначенная для определения проблем с перегрузкой и дуплексом. NDT это Java аплет, который можно запустить с одного из NDT серверов.
Обратите Внимание на Программу scp
Для копирования файлов через Интернет обычно пользуются программой scp. К сожалению, тонкая настройка ТСР не поможет пропускной способности >scp, потому что в scp используетсяOpenSSL, в котором используются статически определенные потоки буферов. Эти буферы действуют на пропускную способность сети как узкое место, особенно в сетях с длинной задержкой и высокими скоростями. Питсбургская страница Сверхвысокопроизводительного Центра High Performance SSH/SCP объясняет это более подробно и, кроме того, там имеется патч для OpenSSL, устраняющий эту проблему.