?

Log in

No account? Create an account
Про расследования и про корреляцию - vanitas_vanit [entries|archive|friends|userinfo]
vanitas_vanit

[ website | My Website ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Про расследования и про корреляцию [Jan. 14th, 2015|11:30 pm]
vanitas_vanit
Который день на работе стоим на ушах. Не так интенсивно, как в дни после "чёрного вторника" и перед НГ, но тем не менее... Упорно не желает хорошо работать одна из систем. Проблема в том, что не удаётся докопаться до исходной причины и устранить её. То есть непосредственная причина как раз видна: резко падает скорость передачи данных по межузловому соединению в кластере (кому это словосочетание кажется абракадаброй - не страшно: суть не в техническом смысле). Проблема в том, что не удаётся понять, отчего она падает. Причин может быть множество, и они все завязаны на разных поставщиков: как оборудования, так и софта. Без их помощи понять причину и устранить её принципиально невозможно, но как раз расположение проблемы "на стыке" усложняет ситуацию многократно.

Поскольку доступа к "внутренностям" технологий мы не имеем (да и не должны вообще-то), то может только пытаться строить гипотезы и находить информацию, которая может помочь в обнаружении причины. Это немного сродни детективному расследованию, а немного - научному эксперименту, ибо как и в последнем мы можем пытаться выявить закономерности и путём воздействий (правда очень ограниченных, ибо останавливать систему надолго нельзя!) уточнять догадки, генерировать новые.

Вот в связи с такой деятельностью приходят в голову мысли о несовпадении понятий "корреляция" и "причинно-следственная связь". Грубо говоря, высокая корреляция каких-то событий означает, что они с большой вероятностью наступают вместе, низкая - когда такая вероятность мала. Очень велик соблазн связать высококоррелированные события причинно-следственной связью. Истоки многих суеверий как раз коренятся в таком соблазне. Но ему нельзя поддаваться, ибо по смыслу выявленная "причинно-следственная связь" может быть совершенно абсурдной.

Пример из ITшной области (если честно, слышал его как байку - сам свидетелем не был, но с технической точки нет оснований сомневаться в принципиальной возможности происшедшего). Консалтинговая служба одного известного поставщика СУБД (системы управления базами данных) получила запрос от крупной финансовой организации разобраться в странном феномене: одна из аналитических финансовых систем почету-то плохо работала (в смысле производительности) в дождливую погоду, причём непосредственный анализ ситуации показывал, что "тормозить" начинала именно СУБД.

То есть высокая корреляция была налицо: практически стопроцентная. В то же время подозревать причинно-следственную связь между плохой погодой и плохой производительностью СУБД было бы абсурдом: ну какое казалось бы дело мощным серверам, стоящим в практически изолированном кондиционированном помещении, до погоды на улице? Тем более не понятно, какой механизм может вызывать изменения в работе программы (то бишь СУБД), которая вообще про погоду ничего не знает??
В общем была ситуация, от которой можно либо стать суеверным, либо вообще сойти с ума. Нескоро дело делалось, но сказку лучше сказать таки скоро. Выяснилось в конце-концов, в чём было дело.
Один из финансовых аналитиков той компании жил недалеко от офиса и для утреннего моциона любил ходить на работу пешком. Соответственно с потребным на это временем рассчитывал весь свой утренний распорядок. Но когда шёл сильный дождь, он всё же ехал на работу на машине, в результате чего появлялся в офисе раньше, чем обычно, и - важно - раньше прочих своих коллег.
Появившись на рабочем месте, он всегда начинал свой день запуском одного и того же финансового отчёта. В хорошую погоду этот отчёт запускался одновременно или чуть позже прочих компонент системы, но вот в дождливую - по вышеуказанной причине - самым первым.
И тут сказывались адаптивные особенности СУБД. Дело в том, что данные, который нужны для выполнения любого запроса в СУБД, располагаются в базе данных, то бишь на диске, но обработать их можно, только считав предварительно в оперативную память. Чтобы оптимизировать доступ к данным, СУБД не "вытирает" считанные данные из памяти после каждого использования, а стремится хранить их там возможно дольше на случай, если они понадобятся вновь. Как говорят программисты, используется кэш в памяти. В зависимости от того, какие запросы начинают выполняться первыми, разным получается содержимое кэша. В каком-то случае там оказываются данные, которые действительно нужны многим, в каком-то - нет. Это влияет на производительность системы, правда лишь краткосрочно, ибо алгоритм поддержки кэша устроен так, чтобы со временем сделать его содержимое возможно более оптимальным.
Долгосрочное воздействие раннего запуска некоторых запросов на систему базировалось на совсем уже тонких механизмах СУБД. Дело в том, что формулируются запросы на специальном языке, удобном для человека, но совершенно не соответствующем механизмам хранения данных в компьютере. Чтобы привести одно к другому, выполняется достаточно сложная работа: сначала синтаксический анализ запроса, который представляет его в виде структуры зависящих друг от друга элементарных операций над данными, ну а далее начинается выбор алгоритма выполнения этих операций. Почему выбор? Потому что как правило выполнить их можно множеством способов, и какой из них окажется оптимальным, зависит от множества факторов, среди которых в частности и статистика использования кэша. Теперь возможно понятно то, что я скажу дальше: получалось, что СУБД выбирала в качестве базовых различные алгоритмы (или ещё говорят - планы) выполнения одних и тех же запросов в зависимости от того, в каком порядке эти запросы начинали поступать в систему.
Вот так и получалось, что в зависимости от погоды СУБД одну и ту же работу выполняла по-разному, ну и - так уж получалось - с различным качеством (выбор оптимального плана выполнения запроса - зачастую очень сложная задача, и к сожалению далеко не всегда СУБД справляется с ней действительно оптимальным образом). Всё оказалось объяснимо рациональными причинами, хотя изначально эффект представлялся абсолютно иррациональным и даже мистическим. Ну и - как я уже отмечал - сам по себе факт высокой корреляции событий не означал наличие между ними непосредственной причинной связи - а только косвенной. Кстати в некоторых случаях и последней может вовсе не быть: например когда оба события являются разными следствиями какой-то одной причины.
LinkReply