Re: NGX_POOL_ALIGNMENT
On Wed, Sep 27, 2017 at 06:35:19AM +0300, Maxim Dounin wrote: > Hello! > > Дальше могут начинаться всякие нюансы, например, с cacheline size: > e.g., если мы работаем со структурой в 64 байта размером, и > cacheline size у нас 64, то выравнивать лучше на те же 64 - тогда > вся структура будет загружаться в кеш процессора сразу. Если же > выравнивать на 8, то одна структура с высокой вероятностью > разъедется по двум строкам кеша, и соответственно работать это > будет медленнее, чем могло бы. Это если на 64 всё выравнивать, то вообще кошмар будет с утилизацией памяти - сплошные дыры. -- Олег Неманов (Oleg Nemanov) ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: NGX_POOL_ALIGNMENT
Hello! On Tue, Sep 26, 2017 at 11:33:50AM +0300, Oleg wrote: > On Mon, Sep 25, 2017 at 02:44:47PM +0300, Maxim Dounin wrote: > > > > Абсолютно. Ну то есть это, безусловно, зависит от многих > > факторов, но на Линуксе со штатным аллокатором на 64-битных > > платформах - будет 16: > > > > https://www.gnu.org/software/libc/manual/html_node/Aligned-Memory-Blocks.html > > > > : The address of a block returned by malloc or realloc in GNU > > : systems is always a multiple of eight (or sixteen on 64-bit > > : systems). > > Спасибо за ссылку. Похоже man для memalign забыли поправить для > 64-битных процессоров. > Для общего понимания, если отвлечься от конкретно ngx_pool, > выравнивания в 8 байт для целых типов(кроме float, double и прочих > SSE/AVX) достаточно для быстрого доступа? > Например, мы выделяем большой кусок памяти и в нём уже выделяем куски > поменьше под всякие char* и выравниваем их на границы 8 байт. Для переменных простых типов - выравнивания на 8 байт AFAIK достаточно, чтобы процессор работал быстро (если не брать в расчёт SIMD-инструкции). Дальше могут начинаться всякие нюансы, например, с cacheline size: e.g., если мы работаем со структурой в 64 байта размером, и cacheline size у нас 64, то выравнивать лучше на те же 64 - тогда вся структура будет загружаться в кеш процессора сразу. Если же выравнивать на 8, то одна структура с высокой вероятностью разъедется по двум строкам кеша, и соответственно работать это будет медленнее, чем могло бы. -- Maxim Dounin http://nginx.org/ ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: NGX_POOL_ALIGNMENT
On Mon, Sep 25, 2017 at 02:44:47PM +0300, Maxim Dounin wrote: > > Абсолютно. Ну то есть это, безусловно, зависит от многих > факторов, но на Линуксе со штатным аллокатором на 64-битных > платформах - будет 16: > > https://www.gnu.org/software/libc/manual/html_node/Aligned-Memory-Blocks.html > > : The address of a block returned by malloc or realloc in GNU > : systems is always a multiple of eight (or sixteen on 64-bit > : systems). Спасибо за ссылку. Похоже man для memalign забыли поправить для 64-битных процессоров. Для общего понимания, если отвлечься от конкретно ngx_pool, выравнивания в 8 байт для целых типов(кроме float, double и прочих SSE/AVX) достаточно для быстрого доступа? Например, мы выделяем большой кусок памяти и в нём уже выделяем куски поменьше под всякие char* и выравниваем их на границы 8 байт. -- Олег Неманов (Oleg Nemanov) ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: NGX_POOL_ALIGNMENT
Hello! On Mon, Sep 25, 2017 at 11:41:43AM +0300, lego12...@yandex.ru wrote: > On Sun, Sep 24, 2017 at 02:44:13AM +0300, Maxim Dounin wrote: > > On Fri, Sep 22, 2017 at 11:45:27AM +0300, Oleg wrote: > > > > > > Т.е. если выставить в 8 (sizeof(void*)), то должно быть норм, так? > > > > На практике разницы не будет, в том смысле, что на современных > > 64-битных платформах возвращаемая память всё равно будет выровнена > > на 16. > > Хм. Максим, я вот что вычитал в man memalign (funtoo linux): > >The glibc malloc(3) always returns 8-byte aligned memory addresses, > so >these functions are needed only if you require larger alignment values. > > Вы уверены, что 16? Абсолютно. Ну то есть это, безусловно, зависит от многих факторов, но на Линуксе со штатным аллокатором на 64-битных платформах - будет 16: https://www.gnu.org/software/libc/manual/html_node/Aligned-Memory-Blocks.html : The address of a block returned by malloc or realloc in GNU : systems is always a multiple of eight (or sixteen on 64-bit : systems). И на FreeBSD на практике тоже будет 16, причём даже для 32-битных платформ - выравнивание 8 возможно только для аллокаций не больше 8 байт, что в данном случае гарантировано не так. -- Maxim Dounin http://nginx.org/ ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: NGX_POOL_ALIGNMENT
On Sun, Sep 24, 2017 at 02:44:13AM +0300, Maxim Dounin wrote: > On Fri, Sep 22, 2017 at 11:45:27AM +0300, Oleg wrote: > > > > Т.е. если выставить в 8 (sizeof(void*)), то должно быть норм, так? > > На практике разницы не будет, в том смысле, что на современных > 64-битных платформах возвращаемая память всё равно будет выровнена > на 16. Хм. Максим, я вот что вычитал в man memalign (funtoo linux): The glibc malloc(3) always returns 8-byte aligned memory addresses, so these functions are needed only if you require larger alignment values. Вы уверены, что 16? -- Олег Неманов (Oleg Nemanov) ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: NGX_POOL_ALIGNMENT
Hello! On Fri, Sep 22, 2017 at 11:45:27AM +0300, Oleg wrote: > On Thu, Sep 21, 2017 at 05:43:12PM +0300, Maxim Dounin wrote: > > On Thu, Sep 21, 2017 at 11:35:45AM +0300, Oleg wrote: > > > > > Кто-нибудь в курсе почему NGX_POOL_ALIGNMENT равен именно 16? > > > > Сколько-нибудь серьёзных причин к тому нет. Одно время были > > попытки выравнивать пулы по размеру страницы - это хорошо работает > > на FreeBSD, где метаинформация об аллокациях храница отдельно, > > однако плохо показало себя на Линуксе, где метаинформация хранится > > непосредственно перед аллокацией. В результате выравнивание было > > уменьшено до консервативного значения 16, и с тех пор такое. > > Т.е. если выставить в 8 (sizeof(void*)), то должно быть норм, так? На практике разницы не будет, в том смысле, что на современных 64-битных платформах возвращаемая память всё равно будет выровнена на 16. -- Maxim Dounin http://nginx.org/ ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: NGX_POOL_ALIGNMENT
On Thu, Sep 21, 2017 at 05:43:12PM +0300, Maxim Dounin wrote: > On Thu, Sep 21, 2017 at 11:35:45AM +0300, Oleg wrote: > > > Кто-нибудь в курсе почему NGX_POOL_ALIGNMENT равен именно 16? > > Сколько-нибудь серьёзных причин к тому нет. Одно время были > попытки выравнивать пулы по размеру страницы - это хорошо работает > на FreeBSD, где метаинформация об аллокациях храница отдельно, > однако плохо показало себя на Линуксе, где метаинформация хранится > непосредственно перед аллокацией. В результате выравнивание было > уменьшено до консервативного значения 16, и с тех пор такое. Т.е. если выставить в 8 (sizeof(void*)), то должно быть норм, так? -- Олег Неманов (Oleg Nemanov) ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: NGX_POOL_ALIGNMENT
Hello! On Thu, Sep 21, 2017 at 11:35:45AM +0300, Oleg wrote: > Кто-нибудь в курсе почему NGX_POOL_ALIGNMENT равен именно 16? Сколько-нибудь серьёзных причин к тому нет. Одно время были попытки выравнивать пулы по размеру страницы - это хорошо работает на FreeBSD, где метаинформация об аллокациях храница отдельно, однако плохо показало себя на Линуксе, где метаинформация хранится непосредственно перед аллокацией. В результате выравнивание было уменьшено до консервативного значения 16, и с тех пор такое. -- Maxim Dounin http://nginx.org/ ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
NGX_POOL_ALIGNMENT
Всем привет. Кто-нибудь в курсе почему NGX_POOL_ALIGNMENT равен именно 16? -- Олег Неманов (Oleg Nemanov) ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru