Как стать автором
Обновить

Комментарии 42

это не воспроизводится пока нигде кроме конкретной виртуалки товарища, сообщившего об ошибке.

После прочтения этой строки сразу возникает вопрос: битая память?

Тогда получение kernel panic | BSOD гарантировано.

И влияет исключительно на питон, причем только третий. Хмм... Ну и ASLR должно как то проявляться тогда, нет? Я имею ввиду запустив тест много раз, процессы будут стучаться по разным адресам. А результат стабильно кривой... Да и кривой только на математике в pytime и т.д.

НЛО прилетело и опубликовало эту надпись здесь

Я всё понимаю, и ECC не панацея и работать питон может худо бедно на тех же адресах (хотя ASLR)… Но как объяснить битой памятью преобразование вида:

1640M -> 1705M -> 1674M

При том что левое и правое относительно стабильны (что касается такта изменений), а то что посредине плавает, при чем 1674M в теории должно зависеть (алгоритмически) от 1705M.

Может миграция виртуалки с одного хоста на другой, с другим CPU другой частоты? Там могут быть засады с коррекцией точного времени

Насколько я понимаю, это не объясняет трассировку

Совершенно верно, время кривое исключительно в питоне. Syscalls, date в shell и т.п. абсолютно не затронуты и никакого дрифта нет, от слова совсем.

Склонируйте или мигрируйте виртуалку на другой хост -- проблема сохраняется?
Если да, то проверьте пакетным менеджером, что CRC всех файлов правильные.

А разве apt при скачивании (или распаковке пакета) не будет ругаться на `hash sum mismatch`? Насколько знаю - должен.

А возможно ли, что где-то битый файл на диске именно от бинарников питона?

Так то да... Но он пробовал его переустанавливать

Кстати, тупо удалить все *.pyc не пытались? Пусть перекомпилит.

Я про проверку всех установленных пакетов. Да, мы не видим библиотечных вызовов во время работы функции, но, возможно, при старте какая-нибудь битая библиотека загрузилась по неправильному адресу и побила код вычисления времени, или файл микрокода процессора оказался побит (да, он подписан и такое повреждение крайне маловероятно), или из-за битого ядра повреждаются данные в стеке (какой-нибудь очень привилегированный поток пишет не туда, да мало ли способов повредить память другого процесса.

Возможно, что-то не так при работе с FPU в QEMU (сохранение и восстановление состояния при уходе в гипервизор и обратно). Возможно, что нужен дебаг на стороне хостовой системы.

Вот, очень хорошая идея. А если бы это было что-то собранное MinGW-w64, то я бы даже сказал где баг искать можно было (fesetenv, который щас исправлен, но до этого я пару лет пытался заставить их его исправить. Пришлось разобраться и самому патч писать)

Вам это удалось воспроизвести где-то ещё? Пример скрипта для воспроизведения есть? Я думаю, надо просить общественность пробовать на разных машинах, пока не найдётся закономерность.

Нет, воспроизвести не удалось нигде больше (я об этом писал)... Да, скрипт есть конечно (см. статью, самый первый снипет)... можно улучшить немного, типа стоп если t больше 1650e6 ну или date из shell... Накидаю как доберусь до компьютера, мобильный хабр это боль.

Проапдейтил статью, внизу прикрепил "пробник" для bash, выводящий строчку с актуальными значениями каждые полсекунды, который останавливается если отклонение превышает 1 час от начального (или соответственно ровно через 1 час).

99.99% железо. Возможно, что даже проц, а не память.

У меня есть железка, которая в memtest, в одном и том же месте показывает проблему, если в систему вставлено 2 плашки(любые. пробовал и другого объёма и т.д. Но проблема всегда в первых блоках второй плашки) и тест запущен многоядерный.

Мемтесты нонче глючные пошли, некоторые просто зависают, другие вообще не работают после сборки из исходников. Причём именно так -- на одной железке (железках, почему-то AMD) зависают в одном и том же месте, на других (intel) работают. Другие версии -- работают везде десятками часов. Попробуйте сменить мемтест (другой версии, другой сборки), погонять уефишный мемтест https://www.memtest86.com/download.htm или вообще попробовать аналог https://github.com/martinwhitaker/pcmemtest

Клонировать виртуалку на другой хост. Искать отличия виртуалки от стандартных либ. Поставить рядом другие сборки питона этой и соседних версий.

Наверняка какой-нибудь локальный глюк типа подбитого из-за сбоя железа *.pyc (ну а вдруг?) или какой-то либы. Вангую, что шансы на баг в дистрибутивном софте исчезающе малы.

Хм, забавно... На некоторых моих виртуалках с fail2ban`ом периодически проскакивали строчки в логах с руганью на возможно некорректно установленную тайм-зону. Естественно, TZ были настроены нормально. Всё перерыл, ничего не нашёл, плюнул и забил. Возможно, это как раз был вышеописанный глюк.

И, да, проблема вряд ли в железе - везде ECC во все щели.

Тут 2 варианта, либо запаздывающее логирование из сервиса (типичный случай nginx log для долгого запроса, когда запись в лог происходит по response сильно отстающий от request time, а nginx запишет именно время начала запроса). Либо баг - https://github.com/fail2ban/fail2ban/issues/2882 (поправлен для новых версий).

С проблемой из статьи конечно ничего общего (там типа "системное" время прыгает).

У меня есть ноутбук, на котором операции с float-ами время от времени возвращают NaN без явной причины. Софт, на котором я это обнаружил — смесь питона с Си, и изучал я эту проблему довольно давно (лет 10 назад), так что уже не помню, проявлялась проблема в питоньем коде или в сишном...

Всё ждал когда же упомянут monkeypatching или какие-то модули, закрывающие собой стандартные, но не дождался.

Как я понимаю, Python пробовали переустанавливать, так что стандартная библиотека вряд ли повреждена. В тестовом однострочнике ничего стороннего не импортировалось. Импорт из файла тоже маловероятен, так как fail2ban и тестовые скрипты запускались в разных директориях.

Надо, конечно, ещё PYTHONPATH посмотреть и вообще на библиотеки, но мне кажется, проблема вряд ли в этом. Мне трудно представить код, который бы патчил стандартные функции так, что получается именно такой результат.

комп: win7 64x
py (3.8.10 64x):
Z:\_py\_новогодний_детектив>py
Python 3.8.10 (tags/v3.8.10:3d8993a, May  3 2021, 11:48:03) [MSC v.1928 64 bit (AMD64)] on wi
n32
время:
(сейчас 2021-12-31 T 21:07:41)
-------------------------------
py -c "import time; print(time.strftime('%Y-%m-%dT%H:%M:%S', time.gmtime(1705034426)))"

Z:\_py\_новогодний_детектив>py -c "import time; print(time.strftime('%Y-%m-%dT%H:%M:%S', time
2024-01-12T04:40:26

Z:\_py\_новогодний_детектив>py -c "import time; print(time.strftime('%Y-%m-%dT%H:%M:%S', time
2024-01-12T04:40:26

Z:\_py\_новогодний_детектив>py -c "import time; print(time.strftime('%Y-%m-%dT%H:%M:%S', time
2024-01-12T04:40:26

(сейчас 2021-12-31 T 21:07:41)
==========

py -c "import time; print(time.strftime('%Y-%m-%d T %H:%M:%S', time.localtime(1705034426)))"

Z:\_py\_новогодний_детектив>py -c "import time; print(time.strftime('%Y-%m-%d T %H:%M:%S', ti
2024-01-12 T 06:40:26

Z:\_py\_новогодний_детектив>py -c "import time; print(time.strftime('%Y-%m-%d T %H:%M:%S', ti
2024-01-12 T 06:40:26

Z:\_py\_новогодний_детектив>py -c "import time; print(time.strftime('%Y-%m-%d T %H:%M:%S', ti
2024-01-12 T 06:40:26

Nix-time 1705M естественно находится в 2024 году (о чем и сказано в посте). Речь про то, что time.time возвращает это значение сейчас (временами, на конкретной машине)... Что этот комментарий должен сказать я не понимаю вовсе... Может поясните?

я не вчитывался в статью, решил что какой-то баг, повторил код - увидел 2024 - написал тут. Стало быть я не понял после прочтения высокий полет мысли в статье.

Ну да, ну да... Статью не читал, но мысль после "прочтения" не понял.

Ошибка в одном в 26 бите, значение ошибки приблизительно равно одному из числу в степени двойки

Похоже, но не совсем


>>> bin(1705615769 - 1640803036)
'0b11110111001111011010111101'
>>> 1640803036 | (1 << 26)
1707911900

Хоть кошерней тут было бы не минус а xor юзать... но оно всё равно ни в long, ни в double тут не "работает" (как минимум в прямом виде).

Я бы предложил попытаться разделить програмная это или аппаратная ошибка. Для этого можно создать легковесную копию при помощи того же lxc/lxd/chroot/docker/whatever.

создание копии на lxc
mkdir /opt/lxc-data


rsync --exclude=/dev \
  --exclude=/home \
  --exclude=/mnt \
  --exclude=/opt/lxc-data \
  --exclude=/proc \
  --exclude=/root \
  --exclude=/run \
  --exclude=/sys \
  --exclude=/tmp \
  --exclude=/snap \
  --exclude=/var/log \
  -av / /opt/lxc-data

apt install lxc

lxc-create lxc --template=none

cd /var/lib/lxc/lxc

mv /opt/lxc-data rootfs

Добавить в /var/lib/lxc/lxc/config

# Distribution configuration
lxc.include = /usr/share/lxc/config/common.conf
lxc.apparmor.profile = unconfined
lxc.cgroup.devices.allow = a


lxc.tty.dir = lxc

lxc.pty.max = 1024

lxc.tty.max = 4

lxc.hook.clone = /usr/share/lxc/hooks/clonehostname

lxc.mount.auto = cgroup:mixed proc:mixed sys:mixed
lxc.mount.entry = /sys/fs/fuse/connections sys/fs/fuse/connections none bind,optional 0 0

# For Ubuntu 14.04
lxc.mount.entry = /sys/kernel/debug sys/kernel/debug none bind,optional 0 0
lxc.mount.entry = /sys/kernel/security sys/kernel/security none bind,optional 0 0
lxc.mount.entry = /sys/fs/pstore sys/fs/pstore none bind,optional 0 0
lxc.mount.entry = mqueue dev/mqueue mqueue rw,relatime,create=dir,optional 0 0
lxc.arch = linux64

# Container specific configuration
lxc.rootfs.path = dir:/var/lib/lxc/lxc/rootfs
lxc.uts.name = lxc

И запускать через

lxc-start -d lxc

lxc-attach lxc

...
lxc-stop lxc

Причем поднимать копию по идее можно на той же машине, чтобы избавиться от copy on write. И так можно сделать легковесный контейнер с минимально необходимыми данными для воспроизведения

Я бы проверил память для начала, вполне возможно что это какой нибудь row hammer в дефектной памяти.

Из последнего: он собрал python 3.10.2 из исходников, результат тот же что и для ванильного 3.9!

Честно погонял однострочник сначала на серваке (Fedora35, python3 v3.10.1), потом на виртуалке (KVM, Alma Linux 8.5, python 3.6.8). И ничего интересного - честно досчитало до победного конца.

Может нужна именно конкретная версия питона, а может, действительно, нужна очень конкретная машина, где это всё запускается :)

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории